【发布时间】:2011-11-21 14:26:43
【问题描述】:
我有一个非常具体的场景,我想使用 jQuery 选择所有元素,进行 CSS 更改,保存元素,然后反转我所做的更改。
目标
我创建了一个名为 jQuery.sendFeedback 的 jQuery 插件。此插件允许用户突出显示屏幕区域,如this demo 所示。当他们提交反馈时,插件会抓取页面上的所有 HTML 并将其转储到回调函数中。像这样:
$('*').each(function ()
{
$(this).width($(this).width());
$(this).height($(this).height());
});
var feedbackInformation = {
subject: $feedbackSubject.val(),
details: $feedbackDetails.val(),
html: '<html>' + $('html').html() + '</html>'
};
if (settings.feedbackSent)
settings.feedbackSent(feedbackInformation);
回调函数接受此反馈信息并进行 AJAX 调用以将页面 HTML 存储在服务器上(此 HTML 包括用户在屏幕上绘制的红色框突出显示)。当技术支持人员需要查看用户的“屏幕截图”时,他们会导航到提供存储的 HTML 的页面,以便开发人员可以看到用户在屏幕上的哪个位置绘制了高亮显示。
我最初的问题是不同的屏幕分辨率使元素大小不同,并且随着屏幕的变化,红色高光会突出显示错误的区域。通过选择页面上的所有元素并在用户拍摄快照时手动将它们的高度和宽度设置为当前的高度和宽度,这很容易解决。这使得所有元素大小都是静态的,非常完美。
$('*').each(function ()
{
$(this).width($(this).width());
$(this).height($(this).height());
});
问题
这个问题是,当插件完成传输此 HTML 时,当前正在查看的页面现在在每个元素上都有静态高度和宽度。这可以防止下拉菜单和其他一些东西按应有的方式运行。我想不出一种简单的方法来扭转我对 DOM 所做的更改而不刷新页面(这很可能最终成为我唯一的选择)。我不想刷新页面。
尝试的解决方案
我需要的是一种方法来操作我发送到服务器的 HTML,而不是 DOM。我尝试将上面的代码更改为先提取 HTML,然后对包含 HTML 的字符串进行操作(因此不会影响 DOM),但我不太确定我在这里做什么。
var html = '<html>' + $('html').html() + '</html>';
$('*', html).each(function ()
{
$(this).width($(this).width());
$(this).height($(this).height());
});
这不起作用。所以要么我需要能够操作 HTML 字符串,要么我需要能够操作 DOM 并在之后撤消操作。我不太确定在这里做什么。
更新
我采用了我在下面发布的解决方案,它现在运行良好。现在我想知道是否有一种方法可以将每个元素的所有 css 静态写入元素,从而无需引用样式表。
【问题讨论】:
标签: javascript jquery dom jquery-plugins jquery-selectors