Hello,
I'm trying to convert a piece of code that creates a dynamic vertical resizing bar in a table from internet explorer to firefox. It's based on a post from http://blogs.crankygoblin.com/blogs/...ges/50712.aspx. I've also read the post on this topic by bggraphics, but he doesn't arrive at a final result. The main problem I am having is that the layerX and layerY event properties don't work. They're supposed to return the position of the mouse event with respect to the enclosing element. I've set the div element to be "position: absolute" in the css stylesheet so I don't know why this isn't working. I set up a textarea in the code that outputs the layerX value when you move over a table header to illustrate the problem.
Any help would be greatly appreciated.
My code is as follows:
/-----
[CODE=javascript]var sResizableEleme nt = "TH"; //Elements to be resized
var iResizeThreshol d = 8;
var iEdgeThreshold = 8;
var iSizeThreshold = 20;
var sVBarID = "VBar";
var oResizeTarget = null; //position and distance moved
var iStartX = null;
var iEndX = null;
var iSizeX = null;
var oAdjacentCell = null;
//Creates VBar on load
function TableResize_Cre ateVBar() {
var objItem = document.getEle mentById(sVBarI D);
if(!objItem) {
alert("VBar created");
objItem = document.create Element("SPAN") ;
objItem.id = sVBarID;
objItem.style.p osition = "absolute";
objItem.style.t op = "0px";
objItem.style.l eft = "0px";
objItem.style.h eight = "0px";
objItem.style.w idth = "2px";
objItem.style.b ackground = "silver";
objItem.style.b orderleft = "1px solid black";
objItem.style.d isplay = "none";
document.body.a ppendChild(objI tem);
//alert(objItem);
}
}
window.addEvent Listener("load" , TableResize_Cre ateVBar,0);
function TableResize_Get OwnerHeader(obj Reference) {
var oElement = objReference;
if(oElement.tag Name.toUpperCas e() == sResizableEleme nt) {
return oElement; //print alert?
}
return null;
}
function TableResize_Get FirstColumnCell (objTable, iCellIndex) {
var oHeaderCell = objTable.rows[0].cells[iCellIndex];
return oHeaderCell;
}
function TableResize_Cle anUp() {
var oVBar = document.getEle mentById(sVBarI D);
if(oVBar) {
oVBar.style.dis play = "none";
}
iEndX = null;
iSizeX = null;
iStartX = null;
oResizeTarget = null;
oAdjacentCell = null;
return true;
}
function TableResize_OnM ouseMove(objTab le, event) {
document.getEle mentById('debug ').value += 'Entered OnMouseMove\n';
var objTH = TableResize_Get OwnerHeader(eve nt.target);
//var objTH = objTable.create THead(objTable, event);
if(!objTH) return;
document.getEle mentById('debug ').value += '\tPASSED objTH\n';
var oVBar = document.getEle mentById(sVBarI D);
if (!oVBar) return;
document.getEle mentById('debug ').value += '\tPASSED oVBar\n';
var oAdjacentCell = objTH.nextSibli ng;
alert("Testing movement");
document.getEle mentById('coord s').value += "Event.clie ntX " + event.clientX + "\n";
document.getEle mentById('coord s').value += "Event.laye rX " + event.layerX+ "\n";
document.getEle mentById('coord s').value += "offsetWidt h " + objTH.offsetWid th+ "\n";
//alert(event.cli entX);
//alert(event.lay erX);
//alert(objTH.inn erHTML);
//alert(objTH.off setWidth);
// Show the resize cursor if we are within the edge threshold. // && (oAdjacentCell != null)
if(event.layerX >= (objTH.offsetWi dth - iEdgeThreshold) ) {
objTH.style.cur sor = "e-resize";
} else {
document.body.s tyle.cursor = "pointer"; // Change this to ""
}
// We want to keep the right cursor if resizing and
// don't want resizing to select any text elements
if(oVBar.style. display == "inline") {
//oVBar.style.lef t = event.clientX + document.body.s crollLeft - document.body.c lientLeft;
// We have to add the body.scrollLeft in case the table is wider than the view window
// where the table is entirely within the screen this value should be zero...
oVBar.style.lef t = event.clientX + window.pageXOff set;
document.body.f ocus(); //window.event?
}
return true;
}
/*
MouseDown event.
This fills the globals with tracking information, and displays the
vertical bar. This is only done if you are allowed to start resizing.
*/
function TableResize_OnM ouseDown(objTab le, event) {
var oTargetCell = event.target;
if(!oTargetCell ) return; // event.currentTa rget
var oVBar = document.getEle mentById(sVBarI D);
if(!oVBar) return;
var oHeaderCell = TableResize_Get FirstColumnCell (objTable, oTargetCell.cel lIndex);
if ((oHeaderCell.t agName.toUpperC ase() == sResizableEleme nt) && (oTargetCell.st yle.cursor == "e-resize")) {
iStartX = event.screenX;
oResizeTarget = oHeaderCell;
// Mark the table with the resize attribute and show the resizer VBar.
// We also capture all events on the table we are resizing because Internet
// Explorer sometimes forgets to bubble some events up.
// Now all events will be fired on the table we are resizing.
objTable.setAtt ribute("Resizin g","true");
//objTable.setCap ture(); // THIS IS NOT SUPPORTED IN NETSCAPE
// We have to add the body.scrollLeft in case the table is wider than the view window
// where the table is entriely within the screen this value should be zero...
oVBar.style.lef t = event.clientX + window.pageXOff set;
oVBar.style.top = objTable.parent Node.offsetTop + window.pageYOff set;
oVBar.style.hei ght = objTable.parent Node.offsetHeig ht;
oVBar.style.dis play = "inline"; //This is crucial
}
return true;
}
/*
MouseUp event.
This finishes the resize.
*/
function TableResize_OnM ouseUp(objTable , event) {
//document.getEle mentById('debug ').value += 'Entered OnMouseUp\n';
// Resize the column and its adjacent sibling if position and size are within threshold values
var oAdjacentCell = null;
var iAdjCellOldWidt h = 0;
var iResizeOldWidth = 0;
if(iStartX != null && oResizeTarget != null) {
iEndX = event.screenX;
iSizeX = iEndX - iStartX;
// Mark the table with the resize attribute for not resizing
objTable.setAtt ribute("Resizin g", "false");
if ((oResizeTarget .offsetWidth + iSizeX) >= iSizeThreshold) {
if (Math.abs(iSize X) >= iResizeThreshol d) {
if (oResizeTarget. nextSibling != null) {
oAdjacentCell = oResizeTarget.n extSibling;
iAdjCellOldWidt h = (oAdjacentCell. offsetWidth);
} else {
oAdjacentCell = null;
}
iResizeOldWidth = (oResizeTarget. offsetWidth);
oResizeTarget.s tyle.width = iResizeOldWidth + iSizeX;
if ((oAdjacentCell != null) && (oAdjacentCell. tagName.toUpper Case() == sResizableEleme nt)) {
oAdjacentCell.s tyle.width = (((iAdjacentCel lOldWidth - iSizeX) >= iSizeThreshold) ? (iAdjCellOldWid th - iSizeX):(oAdjac entCell.style.w idth = iSizeThreshold) )
}
}
} else {
oResizeTarget.s tyle.width = iSizeThreshold;
}
}
TableResize_Cle anUp();
return true;
}[/CODE]
/------
Here is the HTML file:
/------
[HTML]<head>
<title>Table Test</title>
<!--<link rel="stylesheet " type="text/css" href="tabletest .css" /> -->
<style type="text/css">
.tablecontainer
{
position: absolute;
}
.mytable
{
table-layout: fixed;
}
.mytable TD, .mytable TH
{
border: solid 1px black;
width: 120px;
}
.mytable TH
{
background-color: #e0e0e0;
}
</style>
<script type="text/javascript" src="tableresiz e2.js"></script>
</head>
<body>
<div class="tablecon tainer">
<table border="0" cellspacing="0" cellpadding="0" class="mytable"
onmousemove="Ta bleResize_OnMou seMove(this,eve nt)"
onmouseup="Tabl eResize_OnMouse Up(this,event)"
onmousedown="Ta bleResize_OnMou seDown(this,eve nt)">
<tr>
<th>Column 1</th><th>Column 2</th><th>Column 3</th><th>Column 4</th><th>Column 5</th>
</tr>
<tr>
<td>Some Data</td><td>Some Data</td><td>Some Data</td><td>Some Data</td><td>Some Data</td>
</tr>
<tr>
<td>Some Data</td><td>Some Data</td><td>Some Data</td><td>Some Data</td><td>Some Data</td>
</tr>
<tr>
<td>Some Data</td><td>Some Data</td><td>Some Data</td><td>Some Data</td><td>Some Data</td>
</tr>
<tr>
<td>Some Data</td><td>Some Data</td><td>Some Data</td><td>Some Data</td><td>Some Data</td>
</tr>
<tr>
<td>Some Data</td><td>Some Data</td><td>Some Data</td><td>Some Data</td><td>Some Data</td>
</tr>
<tr>
<td>Some Data</td><td>Some Data</td><td>Some Data</td><td>Some Data</td><td>Some Data</td>
</tr>
<tr>
<td>Some Data</td><td>Some Data</td><td>Some Data</td><td>Some Data</td><td>Some Data</td>
</tr>
<tr>
<td>Some Data</td><td>Some Data</td><td>Some Data</td><td>Some Data</td><td>Some Data</td>
</tr>
</table>
<TEXTAREA ID="debug" rows="20" cols="20"> Debug text </TEXTAREA>
<TEXTAREA ID="coords" rows="20" cols="20"> Coords </TEXTAREA>
</div>
[/HTML]/-----
I'm trying to convert a piece of code that creates a dynamic vertical resizing bar in a table from internet explorer to firefox. It's based on a post from http://blogs.crankygoblin.com/blogs/...ges/50712.aspx. I've also read the post on this topic by bggraphics, but he doesn't arrive at a final result. The main problem I am having is that the layerX and layerY event properties don't work. They're supposed to return the position of the mouse event with respect to the enclosing element. I've set the div element to be "position: absolute" in the css stylesheet so I don't know why this isn't working. I set up a textarea in the code that outputs the layerX value when you move over a table header to illustrate the problem.
Any help would be greatly appreciated.
My code is as follows:
/-----
[CODE=javascript]var sResizableEleme nt = "TH"; //Elements to be resized
var iResizeThreshol d = 8;
var iEdgeThreshold = 8;
var iSizeThreshold = 20;
var sVBarID = "VBar";
var oResizeTarget = null; //position and distance moved
var iStartX = null;
var iEndX = null;
var iSizeX = null;
var oAdjacentCell = null;
//Creates VBar on load
function TableResize_Cre ateVBar() {
var objItem = document.getEle mentById(sVBarI D);
if(!objItem) {
alert("VBar created");
objItem = document.create Element("SPAN") ;
objItem.id = sVBarID;
objItem.style.p osition = "absolute";
objItem.style.t op = "0px";
objItem.style.l eft = "0px";
objItem.style.h eight = "0px";
objItem.style.w idth = "2px";
objItem.style.b ackground = "silver";
objItem.style.b orderleft = "1px solid black";
objItem.style.d isplay = "none";
document.body.a ppendChild(objI tem);
//alert(objItem);
}
}
window.addEvent Listener("load" , TableResize_Cre ateVBar,0);
function TableResize_Get OwnerHeader(obj Reference) {
var oElement = objReference;
if(oElement.tag Name.toUpperCas e() == sResizableEleme nt) {
return oElement; //print alert?
}
return null;
}
function TableResize_Get FirstColumnCell (objTable, iCellIndex) {
var oHeaderCell = objTable.rows[0].cells[iCellIndex];
return oHeaderCell;
}
function TableResize_Cle anUp() {
var oVBar = document.getEle mentById(sVBarI D);
if(oVBar) {
oVBar.style.dis play = "none";
}
iEndX = null;
iSizeX = null;
iStartX = null;
oResizeTarget = null;
oAdjacentCell = null;
return true;
}
function TableResize_OnM ouseMove(objTab le, event) {
document.getEle mentById('debug ').value += 'Entered OnMouseMove\n';
var objTH = TableResize_Get OwnerHeader(eve nt.target);
//var objTH = objTable.create THead(objTable, event);
if(!objTH) return;
document.getEle mentById('debug ').value += '\tPASSED objTH\n';
var oVBar = document.getEle mentById(sVBarI D);
if (!oVBar) return;
document.getEle mentById('debug ').value += '\tPASSED oVBar\n';
var oAdjacentCell = objTH.nextSibli ng;
alert("Testing movement");
document.getEle mentById('coord s').value += "Event.clie ntX " + event.clientX + "\n";
document.getEle mentById('coord s').value += "Event.laye rX " + event.layerX+ "\n";
document.getEle mentById('coord s').value += "offsetWidt h " + objTH.offsetWid th+ "\n";
//alert(event.cli entX);
//alert(event.lay erX);
//alert(objTH.inn erHTML);
//alert(objTH.off setWidth);
// Show the resize cursor if we are within the edge threshold. // && (oAdjacentCell != null)
if(event.layerX >= (objTH.offsetWi dth - iEdgeThreshold) ) {
objTH.style.cur sor = "e-resize";
} else {
document.body.s tyle.cursor = "pointer"; // Change this to ""
}
// We want to keep the right cursor if resizing and
// don't want resizing to select any text elements
if(oVBar.style. display == "inline") {
//oVBar.style.lef t = event.clientX + document.body.s crollLeft - document.body.c lientLeft;
// We have to add the body.scrollLeft in case the table is wider than the view window
// where the table is entirely within the screen this value should be zero...
oVBar.style.lef t = event.clientX + window.pageXOff set;
document.body.f ocus(); //window.event?
}
return true;
}
/*
MouseDown event.
This fills the globals with tracking information, and displays the
vertical bar. This is only done if you are allowed to start resizing.
*/
function TableResize_OnM ouseDown(objTab le, event) {
var oTargetCell = event.target;
if(!oTargetCell ) return; // event.currentTa rget
var oVBar = document.getEle mentById(sVBarI D);
if(!oVBar) return;
var oHeaderCell = TableResize_Get FirstColumnCell (objTable, oTargetCell.cel lIndex);
if ((oHeaderCell.t agName.toUpperC ase() == sResizableEleme nt) && (oTargetCell.st yle.cursor == "e-resize")) {
iStartX = event.screenX;
oResizeTarget = oHeaderCell;
// Mark the table with the resize attribute and show the resizer VBar.
// We also capture all events on the table we are resizing because Internet
// Explorer sometimes forgets to bubble some events up.
// Now all events will be fired on the table we are resizing.
objTable.setAtt ribute("Resizin g","true");
//objTable.setCap ture(); // THIS IS NOT SUPPORTED IN NETSCAPE
// We have to add the body.scrollLeft in case the table is wider than the view window
// where the table is entriely within the screen this value should be zero...
oVBar.style.lef t = event.clientX + window.pageXOff set;
oVBar.style.top = objTable.parent Node.offsetTop + window.pageYOff set;
oVBar.style.hei ght = objTable.parent Node.offsetHeig ht;
oVBar.style.dis play = "inline"; //This is crucial
}
return true;
}
/*
MouseUp event.
This finishes the resize.
*/
function TableResize_OnM ouseUp(objTable , event) {
//document.getEle mentById('debug ').value += 'Entered OnMouseUp\n';
// Resize the column and its adjacent sibling if position and size are within threshold values
var oAdjacentCell = null;
var iAdjCellOldWidt h = 0;
var iResizeOldWidth = 0;
if(iStartX != null && oResizeTarget != null) {
iEndX = event.screenX;
iSizeX = iEndX - iStartX;
// Mark the table with the resize attribute for not resizing
objTable.setAtt ribute("Resizin g", "false");
if ((oResizeTarget .offsetWidth + iSizeX) >= iSizeThreshold) {
if (Math.abs(iSize X) >= iResizeThreshol d) {
if (oResizeTarget. nextSibling != null) {
oAdjacentCell = oResizeTarget.n extSibling;
iAdjCellOldWidt h = (oAdjacentCell. offsetWidth);
} else {
oAdjacentCell = null;
}
iResizeOldWidth = (oResizeTarget. offsetWidth);
oResizeTarget.s tyle.width = iResizeOldWidth + iSizeX;
if ((oAdjacentCell != null) && (oAdjacentCell. tagName.toUpper Case() == sResizableEleme nt)) {
oAdjacentCell.s tyle.width = (((iAdjacentCel lOldWidth - iSizeX) >= iSizeThreshold) ? (iAdjCellOldWid th - iSizeX):(oAdjac entCell.style.w idth = iSizeThreshold) )
}
}
} else {
oResizeTarget.s tyle.width = iSizeThreshold;
}
}
TableResize_Cle anUp();
return true;
}[/CODE]
/------
Here is the HTML file:
/------
[HTML]<head>
<title>Table Test</title>
<!--<link rel="stylesheet " type="text/css" href="tabletest .css" /> -->
<style type="text/css">
.tablecontainer
{
position: absolute;
}
.mytable
{
table-layout: fixed;
}
.mytable TD, .mytable TH
{
border: solid 1px black;
width: 120px;
}
.mytable TH
{
background-color: #e0e0e0;
}
</style>
<script type="text/javascript" src="tableresiz e2.js"></script>
</head>
<body>
<div class="tablecon tainer">
<table border="0" cellspacing="0" cellpadding="0" class="mytable"
onmousemove="Ta bleResize_OnMou seMove(this,eve nt)"
onmouseup="Tabl eResize_OnMouse Up(this,event)"
onmousedown="Ta bleResize_OnMou seDown(this,eve nt)">
<tr>
<th>Column 1</th><th>Column 2</th><th>Column 3</th><th>Column 4</th><th>Column 5</th>
</tr>
<tr>
<td>Some Data</td><td>Some Data</td><td>Some Data</td><td>Some Data</td><td>Some Data</td>
</tr>
<tr>
<td>Some Data</td><td>Some Data</td><td>Some Data</td><td>Some Data</td><td>Some Data</td>
</tr>
<tr>
<td>Some Data</td><td>Some Data</td><td>Some Data</td><td>Some Data</td><td>Some Data</td>
</tr>
<tr>
<td>Some Data</td><td>Some Data</td><td>Some Data</td><td>Some Data</td><td>Some Data</td>
</tr>
<tr>
<td>Some Data</td><td>Some Data</td><td>Some Data</td><td>Some Data</td><td>Some Data</td>
</tr>
<tr>
<td>Some Data</td><td>Some Data</td><td>Some Data</td><td>Some Data</td><td>Some Data</td>
</tr>
<tr>
<td>Some Data</td><td>Some Data</td><td>Some Data</td><td>Some Data</td><td>Some Data</td>
</tr>
<tr>
<td>Some Data</td><td>Some Data</td><td>Some Data</td><td>Some Data</td><td>Some Data</td>
</tr>
</table>
<TEXTAREA ID="debug" rows="20" cols="20"> Debug text </TEXTAREA>
<TEXTAREA ID="coords" rows="20" cols="20"> Coords </TEXTAREA>
</div>
[/HTML]/-----
Comment