【问题标题】:How to get rid of sizset and sizcache attributes from jQuery?如何摆脱 jQuery 中的 sizset 和 sizcache 属性?
【发布时间】:2012-11-07 14:10:54
【问题描述】:

我已经知道what sizcache and sizset attributes are,但我担心的是它们在我们的 Web 应用程序中的倍增。我解释说:我们使用 jQuery 开发了一个“自制”的 WYSIWYG html 编辑器,当我们的用户保存结果 HTML 时,我们使用.html()(或innerHTML)检索它,然后将其保存在数据库中。然后我们的用户可以编辑它,并再次保存在数据库中。当使用非 IE 浏览器时,一切都很好,但是在 IE 中,jQuery 添加了那些(ahemm nasty)sizset 和 sizcache 属性,它们最终出现在生成的 HTML 中。当从数据库中重新加载 HTML 并再次保存时,会添加越来越多的 sizset 和 sizcache。

对我来说理想的解决方案是这些属性永远不会出现在数据库中。如果首先有来自 jQuery 的解决方案,我不确定是否要解析 HTML 服务器端以删除它们。有人遇到过这个问题吗?

这是我们所拥有的示例:

HTML:

<div id="source">
  <div sizset="37" sizcache09734513102453994="3" sizcache07081295255533577="350" sizcache0714455993494169="6324"></div>
  ... more html going on
</div>

Javascript:

var source = $('#source').html();

变量“源”最终包含 sizset 和 sizcache 属性

【问题讨论】:

    标签: jquery wysiwyg html sizzle


    【解决方案1】:

    我最近将一个网站移到了运行 IIS 6 的新服务器上。一下子,网页的Header块插入了一个元标记&lt;META content="IE=7.0000" http-equiv="X-UA-Compatible"&gt;,sizset和sizcache属性在IE浏览器下随处可见。然后我查看了 IIS 6 设置,发现那里有一个用于 emulating IE7 的自定义 http 标头设置,它强制其进入客户端(IE)。删除该设置后,我的 IE10 浏览器一切恢复正常。

    【讨论】:

      【解决方案2】:

      I wrote a couple of little functions to cope with this。一个是一个简单的函数,它接受一个 HTML 字符串并删除杂物 (shizzle)。第二个是一个 jQuery 方法,它从选择中删除所述元素 - 这将破坏 IE6 和 7 中该选择的某些 jQuery 选择器 - 带有一个可选的布尔参数也可以从所有子节点中删除。

      注意额外属性nodeIndex 未包含在接受的答案中。

      var fizzleSizzle = function(x){
          return x.replace(/(nodeIndex|sizcache|sizset)[\w\d]*(="[^"]*")*/gi,'');
      };
      
      (function($){
          if(!$) return;
      
          // Strip the shizzle from the DOM; pass a truthy argument to do the same for all children
          $.fn.fizzleShizzle = function(deep){
              var $el = deep ? this.add(this.find('*')) || this;
      
              // Iterate through the selection
              $el.each(function(){
                  var 
                      el  = this, 
                      ats = el.attributes;
      
                  // Iterate through attributes
                  $.each(ats,function(i,x){
                      // Is it one of these?
                      if(/^nodeIndex|^sizcache|^sizset/.test(x))
                          // Fizzle it
                          el.removeAttribute(x);
                  });
              });
      
              return this;
          };
      }(jQuery));
      

      【讨论】:

        【解决方案3】:

        在使用.html() 检索整个字符串后,在整个字符串上添加Use a regular expression:

        var re = /\s*(sizset|sizcache)\d*="[^"]*"/gi;
        source = source.replace(re,'');
        

        http://jsfiddle.net/mblase75/fMdVc/

        另外,jQuery 有一个.removeAttr() 方法,但你必须将它应用到特定的标签:

        jQobj.removeAttr('sizset').removeAttr('sizcache');
        

        【讨论】:

        • 我实际上是在尝试避免在此处stackoverflow.com/questions/1732348/… 中推荐使用带有 html 的正则表达式
        • 这不适用于这里——你不是试图解析整个 HTML 字符串,你只是想删除属性。我添加了另一个建议,但考虑到您似乎是如何使用此 HTML 的(如果没有您的任何代码很难判断),全局正则表达式字符串替换可能是最好的解决方案。
        • 好吧,removeAttr 在这里不起作用,因为 sizcache 的属性名称是由 jQuery 随机生成的(或使用 datetime ?)并且每次都会更改。我添加了一个代码示例来说明我的问题。
        • 我已经更新了我的正则表达式解决方案。如果它不能抓住所有东西,请尝试并修改一下。
        • 好吧,正则表达式解决方案不是我预期的最终结果,但我想它可以完成工作。谢谢
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-10-17
        • 1970-01-01
        • 1970-01-01
        • 2015-04-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多