Jquery条件适用于除safari之外的所有浏览器

时间:2014-05-01 04:12:39

标签: javascript jquery ruby-on-rails safari

在iPhone和iPad上的Safari中,我为条件语句设置的选择器不起作用,导致每个ajax请求都有重复的内容。它适用于android,chrome,firefox,即safari的桌面版。

$('li.micropost').each(function() {
  var nlform, nlid;
  nlid = $(this).data('url');
  if ($("li#post" + nlid + " div.nl-field").length === 0) {
    nlform = new NLForm(document.getElementById("post" + nlid));
  }
});

这里是html

<li id="post<%= feed_item.id %>" class="micropost" data-url="<%= feed_item.id %>">...</li>

当nlform变量存在时,它将以下div添加到其各自的列表项

<div class="nl-field">...</div>

如果没有nlform变量集,这就是html在<li>标签内的样子

<%= form_for((@micropost), :html => { :id => "nl-form", :class => "nl-form" }, :url => microposts_path, :authenticity_token => true) do |f| %>
    <!-- div will be added here if nlform variable is set -->
    <input type="text" value="" placeholder="type here" id="micropost_content1" name="micropost[content1]">
    <button id="btn<%= feed_item.id %>" class="nl-submit" type="submit" name="commit">Post</button>
<% end %>

我的Safari选择器无法识别我的#nl-field类不等于0,因此它会创建一个重复的表单变量,从而导致每个ajax请求出现重复的nl-field div。

我还尝试在data-url属性的开头添加一个字母,但这也没有帮助。

这是添加动态内容https://github.com/codrops/NaturalLanguageForm/blob/master/js/nlform.js

的JavaScript

更新 这是因为我在电脑上调试非常困难。如果有人可以帮助我在移动游戏中调试这个,我可以链接到应用程序的现场演示,我真的很感激。 我尝试将$('li.micropost').attr('class', 'micropos');添加到循环的末尾,这样当我循环使用li.micropost时,它不会重新访问.micropos类,但不知何故,safari仍会循环遍历每个列表项并重复内容。

我还尝试迭代每个列表项并删除重复的div

var seen = {};
$("li#post" + nlid + " .nl-field").each(function() {
   var txt = $(this).text();
   if (seen[txt])
      $(this).remove();
   else
      seen[txt] = true;
});

这种破解几乎可以通过将创建的重复数量限制为2来实现。

  • 我也试过通过Jquery层次结构删除重复的div,如此

    $("li#post" + nlid + " .prompt + div").remove()

  • 除了迭代新添加的列表项之外,这些列表项都是在id为&#39; infscr-loading&#39;的div之后填充的。像这样

    $( "#infscr-loading ~ li" )

  • 我尝试根据nl-field div的存在添加一个新元素,并给出一个id然后我运行我的条件并且也没有做到这一点。

所有这些方法都可以在chrome上正常工作以防止重复。我喜欢徒步旅行的行为是这样的。仅供参考我每次将新对象添加到页面时,都会将此代码作为jquery无限滚动的回调运行。它是用javacript编写的,但对于我的应用程序,我将它转换为coffeescript。 这就是coffeescript的样子

$( "#infscr-loading ~ li" ).each ->
        nlid = $(this).data('url')
        nlform = new NLForm(document.getElementById "post" + nlid ) if $("li#post" + nlid + " .nl-field").length is 0
return

以下是用于创建动态nl-field div https://gist.github.com/anonymous/8cc2f09b2045f8f0d6c8的javascript的要点

1 个答案:

答案 0 :(得分:0)

在超过50次提交实时应用程序后,我终于找到了罪魁祸首。在我创建动态元素的javascript文件中

Array.prototype.slice.call( this.el.querySelectorAll( 'input#micropost_content1' ) ).forEach( function( el, i ) {
  self.fldOpen++;
  self.fields.push( new NLField( self, el, 'input', self.fldOpen ) );
} );

我必须更改'input#micropost_content1'以使用类而不是ID,所有内容都按预期开始工作。