0

我正在开发一个网站,允许用户通过内联“窗口”在同一个浏览器窗口中打开相同内容的多个页面。

由于内容可以重复多次,因此 id 可以是相同的,因此我必须分别“处理”它们,以便区分这些页面。

我目前通过在加载时为脚本分配一个唯一的 id 来做到这一点,如下所示:

var id_key;

 function load_page() {
     id_key++;
     load_script("test.js") //load javascript file
 }
 //test.js:
 $(function () {
     var unique_id = id_key;
     //adds the `unique id ` to the end of all elements  with an id attribute set. ie `mycontainer` becomes `mycontainer_1`
     update_ids(unique_id);

     $("#mybtn_ " + unique_id).click(function () {
         //do stuff
     });
 }

这在大多数情况下都可以正常工作,但是如果多个页面加载速度过快,ID 往往会被覆盖,从而导致混淆和错误。

我想知道这样做是否有更好的技术。我听说过backbone.js,但我不确定这在这种情况下是否有用。

4

2 回答 2

1

有几种通用方法可以解决此类问题:

  1. 加载iframes 中的子页面。每个 iframe 都有自己的 ID 空间。只要所有文档都是从同一个域加载的,所有框架中的脚本都可以通过parent变量相互通信。

  2. 不要使用任何 ID。相反,给每个“窗口”一个 ID,然后通过类和父子关系定位窗口中的元素。请注意,一个元素可以有多个类。

    然后,您可以使用$(selector, win)来查找某个窗口上的元素win。窗口变成了“ Selector Context ”,这意味着 jQuery 将只搜索窗口的子级,而不搜索其他任何内容。

  3. 在脚本的开头,按 ID 定位所有重要元素并将它们保存在 JavaScript 对象中。这样,您可以在不使用 jQuery 选择器的情况下访问它们。

    例如,您可以选择任何具有 ID 的内容,并使用.data()将其保存在窗口元素中。完成此设置后,所有元素都可以通过以下方式访问$(win).data('id')

于 2013-02-22T13:58:51.917 回答
0

您可以通过连接日期和随机数来生成非常好的唯一 ID:

new Date().getTime() + Math.random()

虽然这绝不是完美的,但我认为在您的用例中就足够了。

正如杰克在他的评论中提到的,您可以将此 id 作为获取参数传递给您的新窗口。我曾经用这种方法做了一个类似操作系统的界面,它工作得完美无缺。

于 2013-02-22T08:27:19.137 回答