【问题标题】:jQueryMobile uncaught exception when REMOVING checkboxradio删除 checkboxradio 时 jQueryMobile 未捕获的异常
【发布时间】:2013-06-04 21:07:14
【问题描述】:

收到此消息:

Error: cannot call methods on checkboxradio prior to initialization; 
attempted to call method 'refresh'

我关注了这里的演示:Ugly Mongrel

这是我的 JS 的一个片段:

function(){
  var $pbNum = $('<input checked="checked" id="component-pbnum-'+ _val+ 
        '" name="component-pbnum[]'+
        '" type="checkbox" value="'+ _val+ '" data-mini="true">'+
        '<label for="component-pbnum-'+ _val+ '">'+ _val+ '</label>'),
      $pbNumChk = $($pbNum[0]).on("change", function(ev){
        $pbNum.remove();
        // UNCAUGHT EXCEPTION: "cannot call methods on checkboxradio prior
        // to initialization; attempted to call method 'refresh'"
      });

  $pbnumList.controlgroup("container").append($pbNum);
  $pbNumChk.checkboxradio();
// Have also tried $pbNumChk.checkboxradio().checkboxradio("refresh") 
// as hinted by other answers. No difference.
}

我需要动态添加 checkboxradio(在这种情况下为复选框),但提供在单击/点击时将其删除的能力。

与 jQUI 相比,jQM 的局限性实际上有点令人沮丧。没有(记录)这些小部件的“销毁”方法?总之……

复选框添加到我的控制组就好了。当我在完整浏览器中单击以删除它们时,它们会被删除,但会引发异常。到目前为止,我发现的所有内容都与以下内容类似: https://stackoverflow.com/a/15180600/258598

这就是我要找的东西:http://goo.gl/mVOdo

我不明白。为什么当我删除它时 JS 会抛出一个关于小部件的错误 - 特别是当它在插入时被初始化时?

[编辑]
修复了 $pbNum HTML 字符串中的一个小错字

【问题讨论】:

  • 您是否使用type=checkbox 进行输入?删除后无需刷新。要删除复选框,请使用 $(this).closest('div').remove()
  • 另外,如果 jquery 和 jquery mobile 使用的是哪个版本?因为提供的链接中的代码已经很老了。
  • 是的,使用type=checkbox。我曾尝试过一种容器移除方法,但在触摸设备上,它的副作用是删除了我点击的复选框和旁边的复选框。正如您所看到的,在删除复选框期间,我没有尝试刷新复选框。使用我的脚本示例,复选框被缓存,并在触摸设备和完整浏览器上成功删除。但是在任何一种方法中(直接在缓存的 $pbNum 上或在您的建议中)都会在完整的浏览器上引发异常。
  • 我将通过代码。无论如何,建议使用 JQ 1.9.1 和 JQM 1.3.1
  • 谢谢。我碰巧使用的是 JQ 1.10.1,但使用 1.9.1 进行了测试并遇到了同样的问题。

标签: jquery jquery-mobile jquery-mobile-checkbox


【解决方案1】:

我浏览了jQuery Mobile JS文件,发现当change触发时,jQM在复选框中添加/删除类,然后调用refresh方法.checkboxradio('refresh')来增强标记。

似乎.remove() 发生在refresh 发生之前,所以如果您将删除过程延迟1ms,refresh 将在复选框被删除之前。

值得一提的是stopImmediatePropagation() 并没有帮助停止错误消息。

Demo

代码

$(document).on('change', '.ui-checkbox', function () {
 var box = $(this);
 setTimeout(function () {
  box.remove();
   $('#group').controlgroup().trigger('create');
 }, 1);
});

【讨论】:

  • 我不喜欢使用这样的强制延迟,因为它不能解决根本问题。但在 JQM 团队改进事件处理并添加更多小部件方法以避免这些冲突之前,这将是必须的。感谢您的努力。
  • 我很高兴@cautionbug。问题是..如果我可能会问,您为什么要在单击时删除复选框? :)
  • 在此表单中,用户可以输入零件编号,如果存在,它将被添加到零件编号列表中,用于最终搜索查询(还有其他几个参数)。我尝试使用动态加载的selectmenu 代替,但是该小部件已经存在问题(goo.gl/SDbUR)并且当嵌套到 DOM 中那么远时无法正常运行(当 OPTION 更改时,底层 SELECT 未更新)。所以我不得不想出另一个多项目分组对象。他们可以添加项目,如果他们犯了错误或想要调整结果,可以点击删除。
  • 哦,好吧,明白了。我祝你在项目中一切顺利。如果您需要进一步的帮助,请不要犹豫:)
猜你喜欢
  • 2014-08-07
  • 2013-02-01
  • 2010-09-28
  • 2012-05-31
相关资源
最近更新 更多