2012-01-23 6 views
2

У меня возникла странная проблема с динамической заменой элементов управления с помощью javascript в Google Chrome. Заменяемые элементы управления не отображаются в пользовательском интерфейсе, но когда я использую инструменты для разработчиков, я могу найти замененный элемент, но он не отображается, пока я не закрою инструменты разработчика. после того, как я открою и закрою инструменты разработчика, проблема больше не реплицируется, пока я не обновляю страницу.jquery replaceWith не работает на google chrome

Это происходит только в тех случаях, когда я пытаюсь заменить внешнийHTML элемента.

Я первый попытался с помощью jquery's replaceWith апи, что впадина помощь, поэтому я перешел на следующий сценарий -

function chromeOuterHTML(oldElem, outerhtml) 
{ 
var el = document.createElement('div'); 
el.innerHTML = outerhtml; 
var parentNode = oldElem.parentNode; 
var range = document.createRange(); 
     range.selectNodeContents(el); 
     var documentFragment = range.extractContents(); 
     parentNode.insertBefore(documentFragment, oldElem); 
     parentNode.removeChild(oldElem); 
} 

Я не думаю, что его проблема с моим JavaScript, так как проблема специфична для хрома, а также происходит в только в некоторых случаях.

Любая помощь будет принята с благодарностью

+0

Вы обязательно получите решение быстрее, если сможете опубликовать ссылку на страницу примера! – Beejamin

+0

Несколько других мыслей: Диапазоны - интересные звери - они могут охватывать несколько элементов между их начальными и конечными точками, поэтому они не обязательно выбирают узлы DOM. Это не должно быть проблемой в вашем случае, но вы никогда не знаете. – Beejamin

+0

Я также видел странное поведение при работе с documentFragments, которые имеют более одного узла верхнего уровня. Я не помню специфику, но я обнаружил, что они вели себя намного лучше, когда фрагмент содержался в одном узле верхнего уровня. – Beejamin

ответ

0

Более диагностический инструмент, чем решение, но вы пробовали откладывания InsertBefore?

function chromeOuterHTML(oldElem, outerhtml) 
{ 
var el = document.createElement('div'); 
el.innerHTML = outerhtml; 
var parentNode = oldElem.parentNode; 
var range = document.createRange(); 
     range.selectNodeContents(el); 
     var documentFragment = range.extractContents(); 
      setTimeout(function() {  
       parentNode.insertBefore(documentFragment, oldElem); 
       parentNode.removeChild(oldElem); 
    }, 1); 
} 

В некоторых ситуациях (что я не полностью понимаю), DOM манипуляции могут потерпеть неудачу, если они происходят слишком быстро последовательности. Эта модификация задерживает (только на 1 мс) вставку - возможно, это изменит ситуацию. Также возможно, что он ничего не сделает!

+0

это изменение не помогло :(. –

Смежные вопросы