【问题标题】:jQuery onclick load randomly working with firefoxjQuery onclick 加载随机使用 firefox
【发布时间】:2016-01-14 22:58:47
【问题描述】:

所以我有几个带有onclick 功能的“盒子”:

<div class="box" onclick="load(1);return false;"></div>
<div class="box" onclick="load(2);return false;"></div>

onclick 函数触发一个函数,该函数读取几个单独的 .php 文件(example1.php 和 example2.php)的内容。 这些文件包含使用 fieldset 而不是 div 制作的其他框。

function load(num){ 
$("#loadthis").load("example"+num+".php");
}

上面的函数正在改变这个div的内容:

<div id="loadthis">Load my fieldset boxes</div>

到目前为止一切正常,直到我单击字段集框。

当我单击它时,字段集的背景颜色应该会改变,并且字段集中的单选也应该被选中(因为 css 样式),但这两种情况都不会发生。但我仍然可以在单击收音机(而不是框)时选择收音机。

我已经在 IE 和 Chrome 中对其进行了测试,这段代码大部分时间都在那里工作。 但在 Firefox 中,50% 的时间我无法选择字段集框。

我尝试使用 .on( 类,但效果相同。

$('fieldset.type-a').children('.row').children('.box.col-4').on("click", load);
function load(){
var index = $('fieldset.type-a').children('.row').children('.box.col-4').index( this );
index+=1;
$("#loadthis").load("fs"+index+".php"); 
}

好的,经过一番搜索,我发现在另一个被调用的 .js 文件中已经有一个 onclick 函数:

 function handleStep2() {
  $('.step-form-2 input[type=radio]').change(function () {
    $(this).closest('fieldset').find('.box').removeClass('active');
    $(this).closest('.box').addClass('active');
    $(this).attr('checked', 'checked');
 });

 $('.step-form-2 .select-box .box').click(function () {
   $(this).find('input[type=radio]').trigger('change');
 });
 }

我现在将尝试合并代码,看看是否可以消除点击时未激活活动类的错误。

已解决:我确实通过将两个代码合并为一键式功能来解决它​​。感谢您的所有帮助,但我仍然想知道这是否可以通过不同的方式完成?

【问题讨论】:

  • 您的描述写得很好,但是场景有点太复杂了,无法理解。我建议在jsFiddle.net 创建一个示例场景,保存它,然后在您的问题中发布 URL。这将使我们的回答者能够更好地理解问题,并为我们提供一个尝试解决方案的环境。
  • 所以...动态加载的框不响应 jquery 调用?你应该试试 $('body').on('click', '#loadthis', function() {});
  • '委托事件的优点是它们可以处理来自以后添加到文档中的后代元素的事件。 jquery 文档
  • 在 jsFiddle 或 codepen 上提供我们可以在这些浏览器中验证的示例
  • 如果在 #loadthis 中硬编码 php 文件(字段集)的输出会发生什么?这工作正常吗?你能在小提琴中展示它吗?因为从目前的小提琴来看,它不清楚您所面临的预期行为或问题是什么。

标签: javascript jquery html css


【解决方案1】:

查看事件委托,如果您使用的是 jQuery,这很容易

查看jQuery API 以获得.on(

您还想确保您使用的是不显眼的 JS,因此将其从 HTML 中拉出,将其作为事件侦听器放入 .js 文件中,并在 DOM 作为之前的最后一件事加载后加载脚本你的结束&lt;/body&gt;标签

【讨论】:

  • 感谢您的快速回复。 .on( 函数的文档非常好。如果我理解正确:我可以将此代码放入 JS 文件中并检查是否单击了 div?这也是 Firefox 问题是一个已知问题,你认为这应该改变它。
  • 有点。如果单击子元素,它正在监视父元素,实际上发生了什么。本身没有“问题”,只是没有附加到已动态加载的新元素的事件观察器。此外,每次运行时:handleStep2(),您都在创建额外的事件侦听器,最终会得到双倍和三倍事件,等等每次运行时......给自己添加一堆console.log( 'step *' )*当然是步骤#,或者你正在关注的函数位置,看看所有东西运行了多少次。
  • .on( 方法(它被称为方法,而不是类)是一个委托事件侦听器,因此在父级内部创建动态元素时不需要新事件。这意味着您只需要附加一个运行一次的事件,而不是每次将新的 DOM 元素添加到页面时。希望这会有所帮助,干杯。
【解决方案2】:

这应该是关于加载 php 文件内容的延迟。 当你点击其中一个甚至需要时间时它是否有效?

也许你应该 ajax 来加载 php 文件。顺便说一句,您可以使用 GET 或 POST 方法将数据发送到 php 文件。

您可以查看this 示例。

【讨论】:

  • 感谢您的快速回复。不管我等多久,加载的内容都不会在点击时改变。我可以尝试使用 GET 或 POST 方法获取数据,但我想知道我应该怎么做,因为内容非常大,并且字段集框的数量可能因文件而异,我想对其进行 css 样式设置(包含在原始文件中)。
【解决方案3】:

如果您的函数在 IIFE 中初始化,则内联 js 无法访问此函数。 你说这有时有效,这很奇怪..

IIFE 是一个用于创建胶囊的包装函数,因此客户端无法在运行时修改您的脚本。 看起来像这样:

(function(){
 /* code */ 
}()); 

创建js-events会更好:

on('body', 'click', '.box', function(e) {
    console.log(e.target); // this is the clicked list item
});

希望对你有帮助..

【讨论】:

  • 感谢您的回复,但我已经尝试了 on( 功能,它给了我相同的结果,可能是因为您可以在我编辑的帖子中看到该 div 已经有一个 click 功能。
猜你喜欢
  • 2013-02-18
  • 2016-11-21
  • 1970-01-01
  • 2011-03-29
  • 2013-07-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多