Я делаю код, который удаляет видеоплеер со страницы, а затем при необходимости помещает его обратно (даже если у элемента нет идентификатора). Я нахожу проблемы с 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 РАБОТАЕТ, потому что я импортировал библиотеку javascript-xpath) В IE7, если XPath находит IFRAME, проблем нет, и он работает, но если он находит ОБЪЕКТ, ничего не делает и останавливается на weboElem = document.getElementById(vpId);, как если бы он не нашел идентификатор.

Я попытался изменить код следующим образом:

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 код отлично работает в первой опубликованной мной версии.

0
Andrea Silvestri 19 Фев 2013 в 20:35

1 ответ

Лучший ответ

Починил это! Я решил проблему, заключив ОБЪЕКТ в 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")]/..');
0
Andrea Silvestri 20 Фев 2013 в 19:15