新足迹

 找回密码
 注册

精华好帖回顾

· 漓江 (2010-10-4) annitayu · 关于房价的思考和疑惑 (2009-8-16) patricb
· 我和发型师的故事 (2008-7-29) 孔武 · 【那一年圣诞。。。。。。。。我在北欧】图文全纪录 (2008-12-4) 慕思
Advertisement
Advertisement
查看: 1321|回复: 26

[IT] 请教大家一个javascript的问题 [复制链接]

发表于 2009-2-4 11:29 |显示全部楼层
此文章由 doublezz 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 doublezz 所有!转贴必须注明作者、出处和本声明,并保持内容完整
卡了好一会儿了,我们公司的client developer也不知道要怎么办。

我的需求很简单,就是在一张html table里面有一个cell中有一个iframe,我要移动这个iframe到另外一个cell里面去。于是我写了如下代码:
<html>
        <head>
                <script>
                        function startWorking() {
                                var targetFrame=document.getElementsByName("myFrame")[0];
                                var targetTD=document.getElementById("td1");
                                targetTD.appendChild(targetFrame);
                        }
                </script>
        </head>
        <body>
                <div>
                        <input type="button" value="Start" onclick="startWorking()"/>
                </div>
                <table border=1>
                        <tr>
                                <td id="td1">
                                        ABCDEFG
                                </td>
                                <td id="td2">
                                        <iframe name="myFrame" src="http://www.google.com.au" border="1" height="200" width="200">
                                </td>                       
                        </tr>
                </table>
        </body>
</html>

在IE下一切正常,但是在FireFox下每次移动Iframe的时候FireFox都要去刷新Iframe里面的内容。我不想让它刷新,就需要和IE下面一样,就是移动而已,不需要多余动作。请问大家有什么办法?

另外,我需要的移动是dom中的移动,也就是把这个iframe移动到"td1"这个dom object中去,不是通过css改变坐标的那种纯粹视觉上的移动。

谢谢!

[ 本帖最后由 doublezz 于 2009-2-4 11:32 编辑 ]
Advertisement
Advertisement

发表于 2009-2-4 11:36 |显示全部楼层
此文章由 rogerk 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 rogerk 所有!转贴必须注明作者、出处和本声明,并保持内容完整
iframe这个东西本来兼容性和安全性就不好。以前IE里就好多问题。

现在大家都流行用div了,干吗还非得用iframe呢

2008年度奖章获得者

发表于 2009-2-4 11:43 |显示全部楼层
此文章由 jungle 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 jungle 所有!转贴必须注明作者、出处和本声明,并保持内容完整
要我说呢,就是一开始就在两个CELL里面都有IFRAME,只不过开始时隐藏A显示B,按一下按钮之后隐藏B显示A,就完了嘛。

发表于 2009-2-4 11:49 |显示全部楼层
此文章由 doublezz 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 doublezz 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 rogerk 于 2009-2-4 11:36 发表
iframe这个东西本来兼容性和安全性就不好。以前IE里就好多问题。

现在大家都流行用div了,干吗还非得用iframe呢


我也不想用iframe啊,但是我也是不得已,iframe里面的网页包含了大量的javascript,之前我就用ajax把目标网页里的东西都读出来然后放到我的div中去,结果里面的javascript全都不执行了。除非我把javascript全都堆到外面来。但是不想这样。

用iframe的话就完全不用担心javascriopt的问题了,但是没想到在firefox下面一移动就刷新

发表于 2009-2-4 11:50 |显示全部楼层
此文章由 doublezz 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 doublezz 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 jungle 于 2009-2-4 11:43 发表
要我说呢,就是一开始就在两个CELL里面都有IFRAME,只不过开始时隐藏A显示B,按一下按钮之后隐藏B显示A,就完了嘛。


这个还是算了……

发表于 2009-2-4 11:55 |显示全部楼层
此文章由 rogerk 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 rogerk 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 doublezz 于 2009-2-4 11:49 发表


我也不想用iframe啊,但是我也是不得已,iframe里面的网页包含了大量的javascript,之前我就用ajax把目标网页里的东西都读出来然后放到我的div中去,结果里面的javascript全都不执行了。除非我把javascript全都堆 ...


这个具体就不知道了。。我猜想是firefox在移动iframe的时候有些什么处理和ie不同。。比如firefox特意刷新了iframe的内容等等。。。

你还是google之吧。
Advertisement
Advertisement

发表于 2009-2-4 11:57 |显示全部楼层
此文章由 doublezz 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 doublezz 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 rogerk 于 2009-2-4 11:55 发表


这个具体就不知道了。。我猜想是firefox在移动iframe的时候有些什么处理和ie不同。。比如firefox特意刷新了iframe的内容等等。。。

你还是google之吧。


G了一个早上了已经……实在没辙才敢发贴提问……

发表于 2009-2-4 12:05 |显示全部楼层
此文章由 flyspirit 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 flyspirit 所有!转贴必须注明作者、出处和本声明,并保持内容完整
It's a bug of firefox and they haven't fixed it till now.

Please refer to this link.
https://bugzilla.mozilla.org/show_bug.cgi?id=254144

[ 本帖最后由 flyspirit 于 2009-2-4 12:06 编辑 ]

评分

参与人数 1积分 +4 收起 理由
doublezz + 4 谢谢奉献

查看全部评分

发表于 2009-2-4 12:18 |显示全部楼层
此文章由 doublezz 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 doublezz 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 flyspirit 于 2009-2-4 12:05 发表
It's a bug of firefox and they haven't fixed it till now.

Please refer to this link.
https://bugzilla.mozilla.org/show_bug.cgi?id=254144


谢谢告知

发表于 2009-2-4 14:02 |显示全部楼层
此文章由 doublezz 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 doublezz 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 flyspirit 于 2009-2-4 12:05 发表
It's a bug of firefox and they haven't fixed it till now.

Please refer to this link.
https://bugzilla.mozilla.org/show_bug.cgi?id=254144



4年都没有fix的bug,mozilla真是够可以的。

退役斑竹

发表于 2009-2-4 14:10 |显示全部楼层
此文章由 阿Ka 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 阿Ka 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 doublezz 于 2009-2-4 14:02 发表



4年都没有fix的bug,mozilla真是够可以的。


没办法啊,non-profit机构。。。
Advertisement
Advertisement

特殊贡献奖章

发表于 2009-2-4 15:30 |显示全部楼层
此文章由 kr2000 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 kr2000 所有!转贴必须注明作者、出处和本声明,并保持内容完整
It is better to find out why those js are not working in your div. Forget iframe as Mozzilla did.

发表于 2009-2-4 15:44 |显示全部楼层
此文章由 doublezz 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 doublezz 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 kr2000 于 2009-2-4 15:30 发表
It is better to find out why those js are not working in your div. Forget iframe as Mozzilla did.


我知道为什么那些js不工作,理由很简单,当js ajax读取目标网页内容的时候objHttp.responseText;是不返回<script>标签之内的内容的

发表于 2009-2-4 16:33 |显示全部楼层
此文章由 EE1 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 EE1 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 doublezz 于 2009-2-4 11:49 发表


我也不想用iframe啊,但是我也是不得已,iframe里面的网页包含了大量的javascript,之前我就用ajax把目标网页里的东西都读出来然后放到我的div中去,结果里面的javascript全都不执行了。除非我把javascript全都堆 ...


在firefox里,是会执行的,IE & Safari不执行

发表于 2009-2-4 16:34 |显示全部楼层
此文章由 EE1 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 EE1 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 doublezz 于 2009-2-4 15:44 发表


我知道为什么那些js不工作,理由很简单,当js ajax读取目标网页内容的时候objHttp.responseText;是不返回标签之内的内容的


标签内容是会返回的

特殊贡献奖章

发表于 2009-2-4 16:34 |显示全部楼层
此文章由 kr2000 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 kr2000 所有!转贴必须注明作者、出处和本声明,并保持内容完整
You may try to use other method to read the target page content. Eg in PHP use file_get_contents().

Or you can save the js content in a file and include it in your page if possible.

It might not as easy as I think. I hope I  can give you some ideas.
Advertisement
Advertisement

发表于 2009-2-4 17:19 |显示全部楼层
此文章由 doublezz 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 doublezz 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 EE1 于 2009-2-4 16:34 发表


标签内容是会返回的



对,是会返回的,但是这时候已经无法执行这些javascript了,我使用object.innerHTML=<返回的内容>
然后再调用<返回内容中的包含javascript方法>,结果就报错方法不存在。

发表于 2009-2-4 17:19 |显示全部楼层
此文章由 gracecxf 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 gracecxf 所有!转贴必须注明作者、出处和本声明,并保持内容完整
两种方式,都是想的,没试过,不确定是否可行。lz 若有时间不妨试试。
1。试着改动 parent
eg: js function
function moveFrame()
{
     var newCell = document.getElementById(td1");
     var currentCell  = document.getElementById("td2");
   document.getElementById("myFrame").parent = newCell;
}

2.分别在两个cell 里面各放置一个div,将 iframe 放在 div 里面,然后通过改变 div 的位置,至于改变div的位置可简单通过改变css style。

document.getElementById(id).style.xxxx = xxxx;

[ 本帖最后由 gracecxf 于 2009-2-4 17:28 编辑 ]

发表于 2009-2-4 19:03 |显示全部楼层
此文章由 doublezz 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 doublezz 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 gracecxf 于 2009-2-4 17:19 发表
两种方式,都是想的,没试过,不确定是否可行。lz 若有时间不妨试试。
1。试着改动 parent
eg: js function
function moveFrame()
{
     var newCell = document.getElementById(td1");
     var currentCe ...



谢谢回复,
我已经尝试用改变parentNode的方法,但是结果是firefox依然刷新iframe内容,因为dom对象中是没有“移动”这个方法的,所有的dom tree操作都是先“删除”这个节点然后再“添加”你要的节点,firefox的这个bug就是在于当“删除”的时候丢失了引用(参见mozilla的那个bug报告),所以再次将这个iframe添加回去的时候firefox对其进行了初始化处理,所以我认为是无解的。

css的方法是可行的,缺陷就是这只是表面上的移动,在dom tree里面的结构并没有改变,iframe还是属于td2的子元素,这样对之后的操作会造成不小的干扰。

发表于 2009-2-4 19:07 |显示全部楼层
此文章由 doublezz 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 doublezz 所有!转贴必须注明作者、出处和本声明,并保持内容完整
有哪位大牛能够帮Mozilla一把Fix这个Bug?现在这个Bug已经是Open状态了,俺是对C++一窍不通。

https://bugzilla.mozilla.org/show_bug.cgi?id=254144

发表于 2009-2-4 22:37 |显示全部楼层
此文章由 gracecxf 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 gracecxf 所有!转贴必须注明作者、出处和本声明,并保持内容完整
几年没人fix bug,估计不太会这么快就搞定。

看来估计你得像 #16楼建议的,要么事先保存content object,再print 出来。

或者在iframe的那个target 页面里做点文章,让它即使刷新也能保持内容一致。

再看了一下你#4 楼的解释说用ajax读取内容后javascript出问题,那为何不将所有javascript放在一个单独的文件,然后在需要的时候include 一下文件,这样无需将js移来移去,而且不会有问题。

hmm,当然俺都是想的,毕竟不是自己做的东西。

[ 本帖最后由 gracecxf 于 2009-2-4 23:07 编辑 ]
Advertisement
Advertisement

发表于 2009-2-5 09:32 |显示全部楼层
此文章由 doublezz 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 doublezz 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 gracecxf 于 2009-2-4 22:37 发表
几年没人fix bug,估计不太会这么快就搞定。

看来估计你得像 #16楼建议的,要么事先保存content object,再print 出来。

或者在iframe的那个target 页面里做点文章,让它即使刷新也能保持内容一致。

再看了 ...


谢谢回答,javascript读出来放到外面div的方法我最后还是放弃了,不是因为做不到,而是很难维护,比如说读出来的网页内容里面有和外面页面重名的变量,重名方法,重复的html id,css,或者里面的网页的排版格式等等等,都会给整个外面页面的造成很大的影响,而且以后每次要在里面嵌入一个网页,都还要去看看有没有以上的问题,太难维护,还是使用iframe比较稳妥。

发表于 2009-2-5 10:35 |显示全部楼层
此文章由 荒山 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 荒山 所有!转贴必须注明作者、出处和本声明,并保持内容完整
类似前面的建议
干脆不要用TD, 或者TD只是在那里装装样子

把iframe放到一个SPAN里, 做成浮动的 - SPAN直接加到Body下面

然后每次移动SPAN的位置, 甚至DragDrop SPAN到任意位置?.
[B] 人生多寂寞, 独留往事成空 [B]

发表于 2009-2-5 10:43 |显示全部楼层
此文章由 荒山 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 荒山 所有!转贴必须注明作者、出处和本声明,并保持内容完整
如下代码可以浮动Iframe, 不知道Firefox支持否
<head>
<script>
                    
function handleDropEvent(oEvent) {
        switch(oEvent.type) {
            case "dragover":
            case "dragenter":
                oEvent.returnValue = false;
        }
}
function dragging()
{
    var o
    o=document.getElementById('bbb')
   
    var x=window.event.clientX ;
    var y=window.event.clientY;

    o.style.left = parseInt(oLeft)+parseInt(x)-parseInt(X0);
    o.style.top=parseInt(oTop)+parseInt(y)-parseInt(Y0);
   
    o.style.left = parseInt(oLeft)+parseInt(x)-parseInt(X0);
}
var X0,Y0,oLeft,oTop,w_width

function dragmouse_down()
{
    var o
     o=document.getElementById('bbb')
    //o.style.cursor='pointer'
    oLeft=PopWindowGetLeftPos(o)
    oTop=PopWindowGetTopPos(o)
    X0= window.event.clientX ;
    Y0=window.event.clientY;
    //alert("aaaa")
    o.dragDrop()
    //o.style.cursor='pointer'
}
function PopWindowGetTopPos(inputObj)
{
       
  var returnValue = inputObj.offsetTop;
  while((inputObj = inputObj.offsetParent) != null){
          returnValue += inputObj.offsetTop;
  }
  return returnValue;
}

function PopWindowGetLeftPos(inputObj)
{
  var returnValue = inputObj.offsetLeft;
  while((inputObj = inputObj.offsetParent) != null)returnValue += inputObj.offsetLeft;
  return returnValue;
}
   
</script>
</head>
    <body ondragenter="handleDropEvent(event)"
                                ondragover="handleDropEvent(event)"
                                ondragleave="handleDropEvent(event)"
                                ondrop="handleDropEvent(event)">
            <div>
                    <input type="button" value="Start" onclick="startWorking()"/>
            </div>
             <span style="position:absolute; background:blue" id="ccdd"  ondragover="dragging()" onmousedown="dragmouse_down()">ffff</span>
            
            <span style="position:absolute; background:red" id="bbb"  ondragover="dragging()"        onmousedown="dragmouse_down()">
               <div><input style="width:30" type="text" />
                     <iframe name="myFrame" src="http://www.google.com.au"  height="200" width="200" />
               </div>
            </span>
    </body>

</html>
[B] 人生多寂寞, 独留往事成空 [B]

发表于 2009-2-5 11:37 |显示全部楼层
此文章由 EE1 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 EE1 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 doublezz 于 2009-2-5 09:32 发表


谢谢回答,javascript读出来放到外面div的方法我最后还是放弃了,不是因为做不到,而是很难维护,比如说读出来的网页内容里面有和外面页面重名的变量,重名方法,重复的html id,css,或者里面的网页的排版格式等 ...


还没解决?帮你简单的改了一下javascript,这样就可以了

function startWorking() {
    var td1 = document.getElementById("td1");
    td1.parentNode.appendChild(td1);

    var f = document.getElementsByName("myFrame")[0];
    var td2 = document.getElementById("td2");
    td2.insertBefore(td1.firstChild, f);
}

评分

参与人数 1积分 +4 收起 理由
doublezz + 4 偶对你的景仰如滔滔江水

查看全部评分

发表于 2009-2-5 11:45 |显示全部楼层
此文章由 doublezz 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 doublezz 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 EE1 于 2009-2-5 11:37 发表


还没解决?帮你简单的改了一下javascript,这样就可以了

function startWorking() {
    var td1 = document.getElementById("td1");
    td1.parentNode.appendChild(td1);

    var f = document.getEl ...



足迹的牛人还真是多。你这样确实是不会刷新了,这样的做法是移动其他TD元素,不动这个IFrame,确实是可以的,但是实际上在应用当中,另外一个TD下不只是简单的ABCDEFG,实际上会是另外一个Iframe,这样的话依然会导致那个Iframe的刷新。
Advertisement
Advertisement

发表于 2009-2-5 12:01 |显示全部楼层
此文章由 EE1 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 EE1 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 doublezz 于 2009-2-5 11:45 发表



足迹的牛人还真是多。你这样确实是不会刷新了,这样的做法是移动其他TD元素,不动这个IFrame,确实是可以的,但是实际上在应用当中,另外一个TD下不只是简单的ABCDEFG,实际上会是另外一个Iframe,这样的话依然 ...


呃... 这么多iframe了... 那就不要用td,用样式来控制位置好了,或者等bug被fix了

发表回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Advertisement
Advertisement
返回顶部