Javascript IE 7获取OBJECT元素

时间:2013-02-19 16:35:21

标签: javascript dom

我正在创建一个代码,从页面中删除视频播放器,然后在需要时将其放回(即使元素没有id)。 我发现了IE7的问题 这是我的代码:

var weboElem, weboElemPar, weboElemIndex, weboStored;
function weboRemoveVideoplayer(vpId){
    weboElem = document.getElementById(vpId);
    if(!weboElem) return false;
    weboElemPar = weboElem.parentNode;
    weboElemIndex = 0;
    var child = weboElem;
    while( (child = child.previousSibling) != null ) 
      weboElemIndex++;
    weboElemPar.removeChild(weboElem);
    return true;
}
function weboPlaceVideoplayerBack(){
    if(weboElemPar.insertBefore !== undefined && weboElemPar.childNodes !== undefined)
    {
        weboElemPar.insertBefore(weboElem, weboElemPar.childNodes[weboElemIndex]);
        return true;
    }
    return false;   
}

var result = document.evaluate(     
    '//*/param[contains(@value, "autoplay=1")]/..', // XPath expression 
    document, // context node
    null, // namespace resolver
    XPathResult.ORDERED_NODE_SNAPSHOT_TYPE
);

if(result.snapshotLength > 0)
{
    var node = result.snapshotItem(0);
    node.id = "webo";
    document.getElementById('info').innerHTML = node.nodeName.toLowerCase()+" -> "+node.id;
} else document.getElementById('info').innerHTML = "not found";

(注意document.evaluate WORKS因为我导入了javascript-xpath库) 在IE7上,如果XPath发现IFRAME没有问题并且它可以工作,但是如果它发现OBJECT什么也不做,并在weboElem = document.getElementById(vpId);停止,好像它没有找到id。

我尝试修改这样的代码:

if(result.snapshotLength > 0)
{
    var node = result.snapshotItem(0);
    node.id = "webo";
    node.parentNode.removeChild(node);
    document.getElementById('info').innerHTML = node.nodeName.toLowerCase()+" -> "+node.id;
    if(node.nodeName.toLowerCase() == "object") weboStored = node;
    else weboStored = null;
} else document.getElementById('info').innerHTML = "not found";

并且它有效,视频播放器在页面加载时消失。我想使用该函数,所以我编辑了这样的所有内容(将节点存储到全局var中,稍后我将在weboRemoveVideoplayer函数中将其存储):

var weboElem, weboElemPar, weboElemIndex, weboStored;
function weboRemoveVideoplayer(vpId){
    if(!weboStored) weboElem = document.getElementById(vpId);
    else weboElem = weboStored;
    if(!weboElem) return false;
    weboElemPar = weboElem.parentNode;
    weboElemIndex = 0;
    var child = weboElem;
    while( (child = child.previousSibling) != null ) 
      weboElemIndex++;
    weboElemPar.removeChild(weboElem);
    alert("5");
    return true;
}
function weboPlaceVideoplayerBack(){
    if(weboElemPar.insertBefore !== undefined && weboElemPar.childNodes !== undefined)
    {
        weboElemPar.insertBefore(weboElem, weboElemPar.childNodes[weboElemIndex]);
        return true;
    }
    return false;   
}

// bind XPath methods to document and window objects
// NOTE: This will overwrite native XPath implementation if it exists
//XPathJS.bindDomLevel3XPath(); //solo per xpathJs
var result = document.evaluate( 
    '//*/param[contains(@value, "autoplay=1")]/..', // XPath expression 
    document, // context node
    null, // namespace resolver
    XPathResult.ORDERED_NODE_SNAPSHOT_TYPE
);

if(result.snapshotLength > 0)
{
    var node = result.snapshotItem(0);
    node.id = "webo";
    node.parentNode.removeChild(node);
    document.getElementById('info').innerHTML = node.nodeName.toLowerCase()+" -> "+node.id;
    if(node.nodeName.toLowerCase() == "object") weboStored = node;
    else weboStored = null;
} else document.getElementById('info').innerHTML = "not found";

这样,代码在尝试检索父节点时会阻塞自己。

有人可以建议我在这做什么吗?

PS:使用chrome和firefox,代码在我发布的第一个版本中完美运行。

1 个答案:

答案 0 :(得分:0)

修正了它! 我解决了这个问题,将OBJECT包装在一个div中,我选择了一个id,我可以随时检索它。我在resolveXpath函数中执行此操作。

这里是代码:

var weboElem, weboElemPar, ieObject = false;
var weboElemIndex = 0;
function weboRemoveVideoplayer(vpId){
    var child;      
    if(!ieObject) weboElem = document.getElementById(vpId);
    else weboElem = document.getElementById('my_usage');
    if(!weboElem) return false;
    weboElemPar = weboElem.parentNode;
    weboElemIndex = 0;
    child = weboElem;
    while( (child = child.previousSibling) != null ) weboElemIndex++;
    if(typeof weboElemPar.removeChild !== 'undefined') weboElemPar.removeChild(weboElem);
    else return false;

    return true;
}
function weboPlaceVideoplayerBack(){
    if(typeof weboElemPar.insertBefore !== 'undefined' && typeof weboElemPar.childNodes !== 'undefined' && typeof weboElemPar.appendChild !== 'undefined'){
        if(weboElemPar.childNodes.length > 0 && weboElemIndex < weboElemPar.childNodes.length) weboElemPar.insertBefore(weboElem, weboElemPar.childNodes[weboElemIndex]);
        else weboElemPar.appendChild(weboElem);
        return true;
    }
    return false;   
}
function resolveXpath(path)
{
    //XPathJS.bindDomLevel3XPath(); //solo per xpathJs
    var result = document.evaluate(path,document,null,XPathResult.ORDERED_NODE_SNAPSHOT_TYPE);      
    if(result.snapshotLength > 0){
        var child, node = result.snapshotItem(0);
        if(node.nodeName.toLowerCase() == 'object'){
            ieObject = true;        
            child = node;
            while( (child = child.previousSibling) != null ) weboElemIndex++;
            var div = document.createElement('div');
            div.id = 'my_usage';        
            if(typeof node.parentNode.insertBefore !== 'undefined' && typeof node.parentNode.childNodes !== 'undefined' && typeof node.parentNode.appendChild !== 'undefined'){
                if(node.parentNode.childNodes.length > 0 && weboElemIndex < node.parentNode.childNodes.length) node.parentNode.insertBefore(div,node.parentNode.childNodes[weboElemIndex]);
                else node.parentNode.appendChild(div);
                div.appendChild(node);
            } else return false;
        } else node.id = 'my_usage';            
        return true;
    } else return false;
}
resolveXpath('//*/param[contains(@src, "autoplay=1")]/..');