0

我正在编写一个代码,从页面中删除视频播放器,然后在需要时将其放回原处(即使元素没有 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";

它有效,视频播放器在页面加载时消失。不过我想使用这个函数,所以我编辑了这样的所有内容(将节点存储到一个全局变量中,稍后我会在 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,代码在我发布的第一个版本中完美运行。

4

1 回答 1

0

修复!我通过将 OBJECT 包装在一个带有我选择的 id 的 div 中解决了这个问题,我可以随时检索它。我在 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")]/..');
于 2013-02-20T15:15:20.733 回答