jQuery Chosen:Uncaught NotFoundError:无法执行' appendChild'在' Node':

时间:2015-11-06 11:56:35

标签: javascript jquery jscrollpane jquery-chosen prototype-chosen

我有一个自己无法解决的问题。我正在调试这几天,但没有成功找到问题所在。

我有一个selected.js + jscrollpane.js。当选择打开时,必须将搜索输入字段集中在一起以写入一些搜索字符串。我第一次打开选中时会抛出错误,我无法搜索其中的任何内容。但如果我关闭所选择并重新打开它,一切正常。

我为你做了一个小提琴: http://jsfiddle.net/y2h3ohr3/2/

因此,当我第一次打开所选择的错误时,我可以在Chrome控制台中看到此错误(在Firefox中,错误存在,但控制台没有抛出错误):

  

未捕获NotFoundError:无法执行' appendChild' on'节点':要删除的节点不再是此节点的子节点。也许它被移动了一个模糊的'事件处理程序?

控制台抛出的跟踪:

  

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

     

初始化@ jquery.jscrollpane.min.js:115

     

JScrollPane @ jquery.jscrollpane.min.js:1388

     

(匿名函数)@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

     

(匿名函数)@ 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

     

(匿名函数)@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。(匿名函数)@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

     

(匿名函数)@ chosen.jquery.js:654

     

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

     

elemData.handle @jquery-1.9.1.js:2750

我做了一个小提琴,它的设计与我的项目不一样,但错误再现完美(首次打开时请注意Chrome控制台)。

你可以在这里查看小提琴:

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

任何人都可以帮助我吗?我被困了,我无法赚更多,因为我没有在任何地方找到错误。错误是由jquery抛出,而不是选择,所以我没有自定义appendChild

2 个答案:

答案 0 :(得分: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());public class AdvertActivity extends Activity implements OnClickListener { ImageView ivEAdvertUserImage,ivEAdvertImage; TextView tvEAdvertDislike,tvEAdvertLike,tvEAdvertHeading; EditText etEAdvertComments; Button btnEAdvertSubmit; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_advert); InitUI(); tvEAdvertLike.setOnClickListener(this); tvEAdvertDislike.setOnClickListener(this); btnEAdvertSubmit.setOnClickListener(this); } @Override public void onClick(View v) { // TODO Auto-generated method stub switch (v.getId()) { case R.id.tvEAdvertLike: tvEAdvertLike.setTextColor(color.Blue); break; case R.id.tvEAdvertDislike: tvEAdvertDislike.setTextColor(color.Blue); etEAdvertComments.setEnabled(true); btnEAdvertSubmit.setEnabled(true); break; case R.id.btnEAdvertSubmit: Intent in =new Intent(AdvertActivity.this,EAdFragment.class); startActivity(in); finish(); break; default: break; } } public void InitUI(){ ivEAdvertUserImage=(ImageView)findViewById(R.id.ivEAdvertUserImage); ivEAdvertImage=(ImageView)findViewById(R.id.ivEAdvertImage); etEAdvertComments=(EditText)findViewById(R.id.etEAdvertComments); tvEAdvertDislike=(TextView)findViewById(R.id.tvEAdvertDislike); tvEAdvertLike=(TextView)findViewById(R.id.tvEAdvertLike); tvEAdvertHeading=(TextView)findViewById(R.id.tvEAdvertHeading); btnEAdvertSubmit=(Button)findViewById(R.id.btnEAdvertSubmit); } }

请参阅jsFiddle here

答案 1 :(得分: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