使用Javascript Bookmarklet在当前窗口中打开本地html文件

时间:2012-06-29 14:54:00

标签: javascript browser bookmarklet

我正在尝试构建一个示例bookmarklet来获取当前网页源代码并将其传递给验证器。 Validator不是一个在线网站,而是一个包含大量javascript和html文件的文件夹。我试图在javascript bookmarklet代码的帮助下打开file:/// C:/Users/Electrifyings/Desktop/Validator/Main.html文件,并将源代码放在新打开的窗口的textarea中,但它是由于某些我不知道的原因而无法工作。

以下是带算法的示例代码:

javascript:(function(){var t = document.body.innerHTML;window.open('file:///C:/Users/RandomHero/Desktop/test.html',_self);document.getElementById("validator_textarea")=t;})()

以下是步骤:

  1. 在变量中抓取当前网页源代码。
  2. 在当前或新窗口或新标签中打开本地存储的HTML网页(无论哪种方式对我都没关系,但没有运气)
  3. 将变量中的源代码放入新打开的HTML文件的验证器textarea中。
  4. 我尝试了上面的代码有很多变化,但是它被卡在打开新窗口的部分。要么它根本没有打开新窗口,要么在没有加载文件的情况下打开空白窗口。

    很想得到这个问题的帮助,非常感谢。

    哦,顺便说一句,

    Windows 7 x64,尝试IE,Firefox和Chrome。所有最新和稳定的版本。我想这不是浏览器方面的问题,而是与javascript代码相关的东西没有用file:/// protocol打开URI。如果需要更多细节,请与我们联系。 :)

1 个答案:

答案 0 :(得分:1)

您不希望自己访问的网页能够正常打开file://c:/Program Files/Quicken/YourSensitiveTaxInfo吗?因为如果你犯了一个错误并去了一个“坏”的网站(或者是一个被黑客攻陷的好网站),那么intarweb上的邪恶的人会突然获得你的私人信息。那太糟糕了。

浏览器制造商知道这一点,因此他们提出了非常严格的限制,以防止Javascript代码访问用户本地计算机上的文件。这就是妨碍你的计划。

解决方案?

  • 将整个验证器构建到书签中(除非它真的很小,否则不可能正常工作)
  • 将您的验证码放在网上
  • 编写一个插件(因为用户必须选择安装插件,他们比网页更自由......即使对于Firefox,Chrome等插件基本上只是Javascript)< / LI>

* *编辑* *

  • 额外奖励解决方案,如果您不限于纯客户端实施:
    1. 让您的书签将常规(HTML)表单添加到页面。
    2. 还要在页面中添加一个iframe(如果用CSS样式隐藏它就可以了)
    3. 将表单的target属性设置为指向iframe。这将使得当用户提交表单并且服务器回复该提交时,服务器的回复将转到(隐藏的)iframe,而不是像通常那样替换页面。
    4. 向表单添加文件输入 - 您将无法使用Javascript访问该输入中的文件,但这没关系,因为您的服务器将进行访问,而不是您的书签。
    5. 编写一个服务器端脚本,它接受表单提交,读取随附的文件,然后将文件作为响应返回的parrots。换句话说,您将拥有一个可以POST到的URL,当它在POST的内容中看到一个文件时,它将回复该文件的内容。
    6. 现在您已经拥有了用户可以使用文件输入选择验证器文件的所有内容,将其上传到您的服务器,您的服务器将使用刚刚获得的文件回复,并且该文件将显示为iframe。
    7. 现在您终于拥有了您努力工作的文件(在您的iframe中),您可以$('#thatIframe').html()和中提琴,您可以访问您的文件。您可以保存当前页面的源,然后用该上载的文件替换整个页面(然后将保存的页面源传递回新的验证器页面),或者您可以使用上载的验证器文件的内容执行任何其他操作。

当然,如果文件在不同计算机之间不同,只需让服务器发送验证器文件,就可以使所有更多更简单;这可能是一个没有任何逻辑的纯Apache服务器,因为它所要做的就是提供一个静态文件。

无论哪种方式,如果你采用这种方法,并且你的新文件上传脚本与你的起始网页在同一台服务器上,你将遇到一个新的安全问题:跨域脚本限制。但是,这些限制远不如本地文件访问限制那么严格,因此有办法解决它们(JSONP,跨站点策略文件等)。已经有很多很棒的Stack Overflow帖子解释了这些技术,所以我不打算在这里重复它们。

希望有所帮助。