【问题标题】:How to rewrite js code in ejs如何在ejs中重写js代码
【发布时间】:2016-06-04 12:03:26
【问题描述】:

这段代码我是用js写的,但是需要用ejs重写,因为页面加载后用户看不到。这是我的代码:

<script type="text/javascript" src="js/showads.js" class="deleteMe"></script>
<script type="text/javascript" class="deleteMe">
  if(window.canRunAds == undefined){
    window.location = "/welcome";
  }
  $('.deleteMe').remove();
</script>

我有一个名为 showads.js 的文件,其中包含一个 canRunAds 变量。如果客户端启用了adblock,则不会导入此文件,从而使canRunAds变量未定义,如果客户端将被重定向到'/welcome',然后我只删除这2个脚本,但它不起作用,因为客户可以看到它并可能绕过它。有没有办法在ejs中写这个,因为当我尝试它时,我得到一个错误,说窗口未定义。谢谢!

【问题讨论】:

  • 对不起,但您尝试做的事情是不可能的。您试图隐藏的代码纯粹是客户端任务,因此您无法在服务器上运行它。
  • @Juhana ejs 不是客户端语言吗?你可以写:

    Hi 这会运行。如果您有服务器发送的变量,这也适用!

  • 如果你在客户端运行它就是客户端。但是代码在客户端,客户端可以随意读取、修改和绕过,所以解决不了问题。
  • @Juhana 好吧,还有其他方法吗?或者直接检查用户是否有广告屏蔽!
  • 就像我已经说过的,这是不可能的。用户可以完全控制他们的计算机。

标签: javascript html file variables ejs


【解决方案1】:

确实,您可以在没有任何服务器 (node.js) 的情况下在客户端运行 ejs,但您无法使用它访问 DOM(就像您现在使用 JQuery 一样),所以我假设所有你可以解析到EJS 是:

<%
if(window.canRunAds == undefined){
    window.location = "/welcome";
  }
%>

【讨论】:

    【解决方案2】:

    服务器上的 JavaScript 没有 window 对象。但是可以做的是检查window 对象在运行时是否可用,如果可以访问,则有条件地运行您的代码:

    <script type="text/javascript" src="js/showads.js" class="deleteMe"></script>
    <script type="text/javascript" class="deleteMe">
    
      // Check if window exists, and that canRunAds doesn't
      // On the server, the code within this block should never run
      if(window && !window.canRunAds){
        window.location = "/welcome";
      }
      // Bonus points using the same principle: Avoid assuming jQuery is available in
      // inline script blocks.
      if(window && window.jQuery) { 
        $('.deleteMe').remove(); 
      }
    </script> 
    

    请注意,如果您的 showads.js 脚本正在服务器上运行,您还必须将对 window 的任何调用包装在 if() 检查中,否则服务器将继续抛出错误。

    【讨论】:

    • showads.js 中唯一的内容是这一行:var canRunAdds = true;。 jQuery 是在此脚本之前导入的,但这并不能解决问题,因为如果他们在运行它的页面上按 CTRL + U,他们可以看到它。我想永久隐藏它!
    • 首先,如果您只是设置一个变量而不添加到showads.js 中的window 对象,那么您的代码将永远无法工作。其次,应考虑查看所有提供给用户的代码和材料。如果用户想深入了解并检查您的代码,他们只需要查看所提供页面的源代码,因为您使用了作为文档一部分的内联脚本块。
    • 我现在拥有的代码可以正常工作,它确实检测到了adblock。我想用ejs写的方式不行!
    • 我认为您可能需要注意@Juhana 已经说过的话。是的,如果您的代码在服务器上运行,可以在客户端运行后删除脚本节点并避免意外调用窗口,但我认为您想要实现的是在没有客户端的客户端上运行代码甚至能够意识到它正在运行,这是不可能的。 EJS 只是一种模板语言,可以通过插入 JavaScript 方法和变量的结果来呈现 html 页面。最好重新审视一下白板的意图和语气。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-29
    • 2019-10-28
    相关资源
    最近更新 更多