有没有一个插件可以使 jQuery id 选择器点安全?

发布于 2024-10-28 08:10:33 字数 459 浏览 1 评论 0原文

我已经知道如何选择 ID 包含点的 DOM 元素,并且我已经阅读了 stackoverflow 上的所有相关答案(如下所示: 当 id 包含点时,如何使用 jquery 按 ID 选择 html 节点?),但是问题是有很多插件没有意识到这个问题,并且没有仔细检查我们正在使用的所有插件的代码并适当地替换选择器,我在想也许还有另一个插件/ jQuery 的扩展名,它取代了主要的选择器机制,使其成为点安全的。我正在使用像 jqGrid 这样的插件,并且我在代码中看到很多地方都使用了这样的东西:

$('#' + id).somefunction()

有什么想法吗?

提前致谢

I already know how to select DOM elements with IDs which contain dots, and I've read all the related answers on stackoverflow (like this: How to select html nodes by ID with jquery when the id contains a dot?), but the problem is there's lots of plugins out there that are not aware of this issue, and short of going through the code of all the plug-ins we're using and replace the selectors appropriately, I was thinking that maybe there's another plug-in/extension for jQuery which replaces the main selector mechanism to make it dot-safe. I am using plug-ins like jqGrid and I've seen many places in the code where something like this is used:

$('#' + id).somefunction()

Any ideas?

Thanks in advance

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

蘸点软妹酱 2024-11-04 08:10:33

您可以更改 $.fn.init 函数来更改 jQuery 的行为,但没有一种快速简便的方法可以确保带点的 ID 在整个应用程序中都是安全的。一个快速而肮脏的解决方案将通过更改 init 函数将所有 . 替换为 \\.,但随后所有类选择器都会中断。

唯一可靠的方法是将带有转义点的 ID 传递给所有插件。

编辑

如果您确实想要一个快速而肮脏的解决方案,只要您没有像#id.class这样的东西,这里的解决方案至少可以工作。它适用于#id .class(中间的空格)。

(function($){
 $.fn._init = $.fn.init;
 $.fn.init = function ( selector, context, rootjQuery ) {
  if (typeof selector == 'string' && selector.match('#')) {
   selector = selector.replace(/\#([^\s\.]*)\./g, '#$1\\.')
  }
  return new $.fn._init(selector,context,rootjQuery);
}
})(jQuery);

You can alter the $.fn.init function to change the behavior of jQuery, but there isn't a quick and easy way to make sure IDs with dots in them are safe throughout your application. A quick and dirty solution would replace all .s with \\. by altering the init function, but then all your class selectors break.

The only solid way to do it is passing in the IDs with escaped dots to all your plugins.

EDIT

If you do want a quick and dirty solution, here's one that will at least work as long as you don't have something like #id.class. It will work for #id .class (the space in between).

(function($){
 $.fn._init = $.fn.init;
 $.fn.init = function ( selector, context, rootjQuery ) {
  if (typeof selector == 'string' && selector.match('#')) {
   selector = selector.replace(/\#([^\s\.]*)\./g, '#$1\\.')
  }
  return new $.fn._init(selector,context,rootjQuery);
}
})(jQuery);
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文