`
yiminghe
  • 浏览: 1465408 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Ext.Element.setXY 使用注意 bug in IE ?

阅读更多

有兴趣的可以在 ie ff 中分别执行这段代码 :

 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>setXY bug</title>

<!--
<script type="text/javascript" src="ext-base.js"></script>
<script type="text/javascript" src="ext-core.js"></script>
-->
<script type="text/javascript" src="ext-core-3.0.js"></script>

</head>
<body>
	
	<div id="test1" style="position:relative;width:100px;height:100px;border:1px solid green;
padding:20px;">
	
		<div id="test2" style="position:absolute;width:50px;height:50px;margin:10px;
border:1px solid red;">
			
	</div>
	</div>
<script type="text/javascript">
//<![CDATA[
Ext.onReady(function(){
	alert("getBoundingClientRect of test2 : "+
document.getElementById('test2').getBoundingClientRect().left);
	alert("offsetLeft of test2 : "+document.getElementById('test2').offsetLeft);
	
	alert("getBoundingClientRect of test2's parent : "+
document.getElementById('test1').getBoundingClientRect().left);
	
	Ext.get('test2').setX(Ext.get('test2').getX());
	//if fixed by myself
	//Ext.get('test2').setX(Ext.get('test2').getX() - 
//parseInt(Ext.get('test2').getStyle("margin-left"),10));
	
	alert("after current getBoundingClientRect of test2 : "+
document.getElementById('test2').getBoundingClientRect().left);
});
//]]>

</script>

</body>
</html>


将得到的页面坐标再设置回去,ie元素位置却改变了。

 

分析:

 

以前的文章 也分析过,由于 ie 不能取得运行时的未显式设置的 left 值,于是 extjs 用offsetLeft 变通了一下,可是毕竟 offsetleft 和 left 还是不一样的 。


left 可能都比较熟悉了,有一点注意: css 2.1 规定偏移是以外边距边界而不是以内容边界。

 

关于 offsetleft


在元素 A 上读取 offsetLeft 属性时,必须按以下算法返回结果值:

   1. 如果元素 A 是 HTML 的 body 元素,其 display 属性计算值是 none,或者不具有 CSS 布局盒子,则返回 0,并停止本算法。
   2. 如果元素 A 的 offsetParent 是 null 或者是 HTML 的 body 元素,以 CSS 像素为单位返回元素 A 左边框距画布原点的水平距离,并停止本算法。
   3. 以 CSS 像素为单位返回元素 A 左 border edge 距其 offsetParent 左 padding edge 的距离。关于 border edge 与 padding edge 可见 css2.1 的相关定义

为了更好地理解,可以参照下图:


 


上图中,大块是小块的 offsetParent,红色是大块的边框,蓝色是小块的边框,蓝框外白色区域是大块的 padding 或/和 小块的 margin 或其他元素或其他原因造成的空白。offsetTop 是小块上边框上部与大块上边框下部的距离;offsetLeft 是小块左边框左部与大块左边框右部的距离。

 

则可见在例子中情况下  offsetLeft = left + margin-left


所以精确需要的话改动一下

 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>setXY bug</title>


<script type="text/javascript" src="ext-base.js"></script>
<script type="text/javascript" src="ext-core.js"></script>

<!--
<script type="text/javascript" src="ext-core-3.0.js"></script>
-->
</head>
<body>
	
	<div id="test1" style="position:relative;width:100px;height:100px;
border:1px solid green;padding:20px;">
	
		<div id="test2" style="position:absolute;width:50px;height:50px;
margin:10px;border:1px solid red;">
			
	</div>
	</div>
<script type="text/javascript">
//<![CDATA[
Ext.onReady(function(){
	alert("getBoundingClientRect of test2 : "+
document.getElementById('test2').getBoundingClientRect().left);
	alert("offsetLeft of test2 : "+document.getElementById('test2').offsetLeft);
	
	alert("getBoundingClientRect of test2's parent : "+
document.getElementById('test1').getBoundingClientRect().left);
	if(!isNaN(parseInt(Ext.get('test2').getStyle("left"))))
		Ext.get('test2').setX(Ext.get('test2').getX());
	else
		Ext.get('test2').setX(Ext.get('test2').getX() - 
parseInt(Ext.get('test2').getStyle("margin-left"),10));
	
	alert("after current getBoundingClientRect of test2 : "+
document.getElementById('test2').getBoundingClientRect().left);
});
//]]>

</script>

</body>
</html>

 

 

PS:

 

其实对于任何不能得到精确用户未设置left数值的浏览器都存在ie中的情况。(现代的标准浏览器可以避免),进一步发散来讲,这就涉及了 ie 下取得css属性像素值的问题 。另外还有

关于 setXY 的一点剖析 ,特别对于以html为包含块的情况。

 

 

已提交 extjs 官方bug报告。

 

 

  • 大小: 2 KB
分享到:
评论
1 楼 lchj 2009-07-03  
以前我都是这么干的:
	var xy = inputel.getXY();
	date.style.top=0;
	date.style.left=0;
	date.setXY([xy[0]+1,xy[1]-1]);

相关推荐

    EXTJS总结.txt

    // 返回下一个侧边节点,但一定要是div的,找到就返回,类型是Ext.Element Ext.fly('elId').next("div"); 27.prev 获取上一个侧边节点,跳过文本节点。可选地可送入一个期待的选择符。 // 返回上一个侧边节点,...

    对Ext库的总体概述和完成一些常见的程序任务。新用户应从这里开始

    对于新用户而言,掌握`Ext.onReady`函数以及`Ext.Element`对象的基本用法是非常重要的。随着对Ext库更深入的学习,你会发现它还提供了更多高级的功能,如数据绑定、图表绘制等,可以满足更复杂的应用场景需求。

    ExtJs查看图片控件,并且图片可以拖动例子.docx

    这里的关键在于使用了 `Ext.Panel` 和 `Ext.image` 这两个组件来封装图片展示逻辑。 ##### 3.2 拖动功能的实现 为了使图片可以被用户拖动,需要使用到 ExtJs 提供的拖放 API。主要涉及到的类有 `Ext.dd....

    用extjs 4.0打造自己的WEB桌面

    在上面的代码中,我们使用 Ext.create 方法创建了一个存储模型,并将其作为 desktop 的配置项。在这里,我们可以添加、删除或修改桌面图标,以查看不同的效果。 小结 在本教程中,我们使用 ExtJS 4.0 创建了一个...

    Ext 4 桌面图标换行

    Ext.fly(items[i]).setXY([col.x, row.y]); // 更新行索引和位置 row.index++; row.y = row.y + btnHeight + btnPadding; } } // 在createDataView中添加监听器 createDataView: function () { return { // ...

    解决extjs 桌面图标换行方法

    Ext.fly(items[i]).setXY([col.x, row.y]); // 设置图标位置 row.index++; row.y = row.y + btnHeight + btnPadding; } } ``` ##### 2. 在`createDataView`函数中添加监听器 接下来,在`createDataView`函数中...

    经典的YUI 示例中文文档

    - **`YAHOO.util.Dom.setXY(element, [x, y])`**:同时设置元素`element`的水平和垂直坐标。 - **`YAHOO.util.Dom.getX(element)`**:获取元素`element`的水平坐标。 - **`YAHOO.util.Dom.getXY(element)`**:获取...

    extjs4.0desktop图标换行

    - 使用`Ext.fly(items[i]).setXY([col.x,row.y]);`动态设置每个图标的坐标,实现了灵活的布局控制。 ### 总结 通过上述分析,我们深入了解了如何在ExtJS 4.0中利用Desktop组件实现桌面图标自动换行功能。这不仅...

    YAHOO.util.Dom.rar_YAHOO.util_YAHOO.util.Dom.chm_yahoo.util同步

    - `setXY(element, xy)`:设置元素的位置坐标。 - `getWidth(element)`和`getHeight(element)`:获取元素宽度和高度。 - `setWidth(element, width)`和`setHeight(element, height)`:设置元素的宽度和高度。 4....

    YAHOO UI 工具库

    YUI提供了详尽的位置控制和访问功能,如`setX`, `setY`, `setXY`, `getX`, `getY`, `getXY`用于定位元素,`getRegion`获取元素区域,以及获取页面可视区和文档尺寸的方法。 #### 结语 YAHOO UI 工具库不仅是一个...

    1.PHP使用插件fpdf fpdi 给PDF文件加水印(中文乱码)

    5. **添加水印**:使用fpdf的`SetFont()`方法设置字体,`SetXY()`设置位置,`Cell()`或`MultiCell()`方法添加文本水印,`Image()`方法添加图片水印。注意,对于中文,你需要确保设置的字体支持中文字符。 ```php $...

    c程序设计类模板与向量PPT学习教案.pptx

    std::cout &lt;&lt; "Element at index 0 in v2: " &lt;&lt; v2.at(0) ; // 输出:Element at index 0 in v2: 1.1 return 0; } ``` 通过以上内容的学习,我们可以了解到C++中的类模板和向量的基本概念及使用方法。类模板为...

    STM32LCD12864

    3.setXY函数:locate_x_y(u8 x,u8 y),用于设置LCD12864液晶显示屏的显示坐标。 4.显示字符串函数:display_string(u8 x,u8 y,u8 *dat),用于在LCD12864液晶显示屏上显示字符串。 5.显示整型变量函数:DisInt(u8 x...

    PCLOGO命令.pdf

    17. SETXY:设置小海龟的坐标。 18. SETX:设置小海龟的横坐标。 19. SETY:设置小海龟的纵坐标。 数学函数 20. SUM:求和函数。 21. REMAINDER:余数函数。 22. QUOTIENT:求商函数。 图形模式 23. DRAW:初始...

    3.PHP使用插件fpdf fpdi 给PDF文件加水印(中文乱码)

    可以使用`SetXY`来设置文字的位置,`SetFont`来选择已注册的字体,`SetFontSize`来设定字体大小,`Cell`或`Text`来写入水印文本。 ```php function addWatermark($pdf, $text) { $pdf-&gt;SetTextColor(150, 150, ...

    C++对象和指针的引用

    在实际中,使用对象引用作函数参数要比使用对象指针作函数更普遍,这是因为使用对象引用作函数参数具有用对象指针作函数参数的优点,而用对象引用作函数参数将更简单,更直接。所以,在C++编程中,人们喜欢用对象...

    YUI 详细说明文档

    提供了`setPosition`, `getXY`, `setXY`等方法来获取和设置元素的位置坐标。 #### 三、YUI提供的element工具 Element工具集扩展了DOM操作的能力,提供了一系列更高级的DOM处理方法。 #### 四、YUI提供的Event工具...

    PHP-----fpdf扩展类的使用

    在使用 FPDF 之前,你需要先下载扩展库文件。通常,这些文件包含一个 `fpdf.php`,将其放在项目中的适当目录下。然后在 PHP 脚本中通过 `require_once` 或 `include_once` 引入该文件,使你的脚本能够访问 FPDF 类...

    《YUI使用文档》汉语版的yui学习材料

    《YUI使用文档》汉语版是一份详细的YUI学习材料,它涵盖了这个JavaScript库的核心功能和使用方法。YUI,全称Yahoo! User Interface Library,是Yahoo开发的一个开放源代码的JavaScript库,旨在帮助开发者创建交互式...

    Logo命令大全[借鉴].pdf

    9. **SETX, SETY, SETXY**: 设定海龟的横纵坐标,使其移动到指定位置。 10. **SETHEADING**: 设置海龟的朝向,可以指定一个角度。 11. **XCOR, YCOR, GETXY**: 获取海龟当前的位置坐标。 12. **SETPC, SETBG**: 分别...

Global site tag (gtag.js) - Google Analytics