3

У меня проблема, которую невозможно решить самостоятельно. Я отлаживаю это в течение нескольких дней, но не успел найти, где проблема.jQuery Chosen: Uncaught NotFoundError: Не удалось выполнить 'appendChild' в 'Node':

У меня есть selected.js + jscrollpane.js. Когда выбранный объект открыт, поле ввода поиска должно быть сфокусировано для записи некоторой строки поиска. В первый раз, когда я открываю выбранный, возникает ошибка, и я не могу ничего найти в ней. Но если я закрою выбранный и снова открою его, все будет хорошо.

я сделать скрипку для вас: http://jsfiddle.net/y2h3ohr3/2/

Так ошибка, когда я открываю первый раз выбранная я могу видеть эту ошибку в консоли Chrome (в Firefox, ошибка существует, но консоль не бросает ошибку):

Uncaught NotFoundError: Failed to execute 'appendChild' on 'Node': The node to be removed is no longer a child of this node. Perhaps it was moved in a 'blur' event handler?

трассировка, что консоль бросает:

jQuery.extend.buildFragment @ jquery-1.9.1.js:6541

jQuery.fn.extend.domManip @ jquery-1.9.1.js:6129

jQuery.fn.extend.append @ jquery-1.9.1.js:5949

initialise @ jquery.jscrollpane.min.js:115

JScrollPane @ jquery.jscrollpane.min.js:1388

(anonymous function) @ jquery.jscrollpane.min.js:1407

jQuery.extend.each @ jquery-1.9.1.js:648

jQuery.fn.jQuery.each @ jquery-1.9.1.js:270

$.fn.jScrollPane @ jquery.jscrollpane.min.js:1399

(anonymous function) @ chosen.jquery.js:774

jQuery.event.dispatch @ jquery-1.9.1.js:3074

elemData.handle @ jquery-1.9.1.js:2750

jQuery.event.special.focus.trigger @ jquery-1.9.1.js:3256

jQuery.event.trigger @ jquery-1.9.1.js:2952

(anonymous function) @ jquery-1.9.1.js:3677

jQuery.extend.each @ jquery-1.9.1.js:648

jQuery.fn.jQuery.each @ jquery-1.9.1.js:270

jQuery.fn.extend.trigger @ jquery-1.9.1.js:3676

jQuery.fn.(anonymous function) @ jquery-1.9.1.js:7403

$.fn.extend.focus @ jquery-ui.js:230

Chosen.results_show @ chosen.jquery.js:968

Chosen.container_mousedown @ chosen.jquery.js:839

(anonymous function) @ chosen.jquery.js:654

jQuery.event.dispatch @ jquery-1.9.1.js:3074

elemData.handle @ jquery-1.9.1.js:2750

я сделать скрипку, дизайн это не то же самое, что и в моем р roject, но ошибка воспроизводится отлично (обратите внимание на консоль хром, когда открываете первый раз выбранный).

Вы можете просмотреть скрипку здесь:

http://jsfiddle.net/y2h3ohr3/2/

Может кто-нибудь мне помочь? Я застрял, и я не могу сделать больше, потому что я нигде не нашел ошибку. Ошибка бросает jquery, а не выбранный, поэтому я не сделал пользовательский appendChild.

+0

я могу приложить больше информации, только скажите мне, и я разделяю, что вам нужно просмотреть эту проблему. Спасибо –

+1

Для меня в Firefox все равно не работает. Можете ли вы сказать, что вы используете jscrollpane.js? Недостаточно ли выбрано.js? Если вы объясните разницу вашего подхода с демонстрационными версиями на [https://harvesthq.github.io/chosen/](https://harvesthq.github.io/chosen/), я постараюсь добиться этого вечером. – vitalii

+0

Это странная спецификация клиента. Обязательно использовать jscrollpane. Да, это круто, дерьмо и все прилагательные, о которых вы думаете, думали обо мне. Но я не могу его удалить. Если вы видите скрипку, в коде выбранного изменен, чтобы использовать jscrollpane, так что это не то же самое, что и оригинал.Лучше отлаживать шаг за шагом, но я делаю это, и я не знаю, где проблема. Если вам нужна конкретная информация, скажите, пожалуйста. Спасибо!! –

ответ

1

Проблема, как представляется, в следующей строке: pane = $('<div class="jspPane" />').css('padding', originalPadding).append(elem.children());

Вместо append она должна быть appendTo, как div.jsPane добавляется к существующему элементу. pane = $('<div class="jspPane" />').css('padding', originalPadding).appendTo(elem.children());

См jsFiddle here

+0

У вас возникли ошибки в консоли? – Taleeb

+0

Не сейчас, ошибка исчезает, все в порядке. Но поведение по-прежнему странно –

1

Это происходит потому, что в строке 115 в вашей скрипке:

pane = $('<div class="jspPane" />').css('padding', originalPadding).append(elem.children()); 

вы пытаетесь добавить elem.children() в вашу панель, но при выборе что-то в вашем отборном дети меняются. Поэтому jQuery пытается удалить и добавить дочерний элемент, который больше не существует. Быстрое решение было бы клонировать elem.children, хранить их в var и добавлять клонированных детей. Как это:

var $children = elem.children().clone(); 
        pane = $('<div class="jspPane" />').css('padding', originalPadding).append($children); 

Updated fiddle

+0

К сожалению, это работает только в первый раз, когда я открываю выбранный. В следующий раз это не работает ... это странно, потому что в скрипке работает нормально. То же самое в решении @Taleeb. –