【问题标题】:Dynamically writing Javascript code?动态编写Javascript代码?
【发布时间】:2018-04-03 04:11:18
【问题描述】:

我正在使用相同的代码库创建动态网站,我需要根据某些逻辑在其中显示适当的 Google 广告 Javascript 代码。

在我的 .Net 4、MVC3 环境中,我设置了以下场景:

导航到 www.mysite.com/script_processor/ 返回以下文本:

function doAlert(v1, v2){alert('Called alert()' + v1 + ' : ' + v2);}

这段文字来自我的模型:

page.stringResponse = "function doAlert(v1, v2){alert('Called alert()' + v1+ ' : ' + v2);}";   

然后我可以从一个单独的站点/页面执行类似的操作:

<script type="text/javascript" src="http://mysite.com/script_processor/">
</script>
<script type="text/javascript">
    doAlert('string 1', 'string 2');
</script>

如您所料,我收到一个带有“Called alert() string 1 : string 2”的警告框,因此可从站点 2 访问 mysite.com 上的函数。

显然,当我从页面查看源代码时,我只看到 doAlert() 调用,而不是位于 mysite.com 上的函数的内容。

现在,我想要一个函数来动态写出 javascript,而不是 mysite.com 上的 doAlert(),当它被调用时,可以在站点 2 上看到它。

我创建了一个模型方法:

public GetResponsePage GetPageResponse(string V1, string V2)
{
    var page = new GetResponsePage();
    page.stringResponse = "<script type=\"text/javascript\">document.write('testing injected Javascript.');alert('value of v1: " + V1 + "value of v2: " + V2 + "');</script>";
    return page;
}

导航到路线时,我看到弹出窗口和“测试注入的 Javascript”。在页面上。

当我从站点 2 引用此内容时,我没有看到弹出窗口,也没有在页面源代码中看到“测试注入的 Javascript”。

正如我所提到的,我稍后将用相应的 Google Ads js 代码的 JS 代码替换它。

我认为这不太正确......我错过了什么?

谢谢。

【问题讨论】:

  • 如果您的目标是能够在页面上包含外部 javascript 并让外部 javascript 更改页面内容,以便您在查看源代码时看到更改后的内容,它赢了不行。
  • 不,我只想动态设置页面上显示的 javascript。因此请求进入 /script_processor/,并返回需要从调用它的站点可见的适当 Javascript。

标签: javascript asp.net-mvc asp.net-mvc-3 dynamic


【解决方案1】:

您可以使用永远邪恶的eval 来动态执行 JavaScript。你传入的 JavaScript 也可以声明函数。

eval("function doAlert(v1, v2){alert('Called alert()' + v1 + ' : ' + v2);}");

我不确定究竟你想要完成什么,但你可以在任何你想要的地方进行这样的 eval 调用:

function createDoAlertFunction(){
    eval("function doAlert(v1, v2){alert('Called alert()' + v1 + ' : ' + v2);}");
}

请注意,这应该避免。坚持用老式的方式声明你的函数,就像你现在所做的那样。

编辑

哦,你希望 MVC 动态注入 JavaScript。 MVC 有一个 JavaScriptResult,但看起来它的使用非常强烈,强烈 不鼓励。

不过,这里有一个 link 说明了它的用途

public ActionResult DoSomething() {  
   string s = "$('#some-div').html('Updated!');";  
   return JavaScript(s);  
}  

以及为什么这不是一个好主意

【讨论】:

  • 上面更新了更多细节。
  • 感谢有关 eval 的信息...我过去一直远离这个。我想要完成的是在进行 js 引用时,来自 www.mysite.com/script_processor/ 的响应对于 Google/etc 来说是可见的。从我上面的测试中,我知道脚本是可访问的,并且我可以将变量传递给 script_processor,这将允许我添加适当的 js 响应文本。使用站点 1 上的引用 script_processor,当我看到的只是代码中的引用时,如何验证脚本是否已加载且可见?
  • @ElHaix - 啊,我明白了。假设在脚本中声明了一个名为x 的全局变量,并且您想知道该脚本是否已加载。最好的方法是检查 x 是否存在,你可以这样做if (typeof x === "undefined") alert("not loaded");
  • @ Adam - 有道理。我参加了 alert() 测试。感谢您的推动。
  • @ElHaix - 当然。 x 可以是一个函数,并且可以正常工作。因此,对于您的示例,您可以测试是否使用 if (typeof doAlert === "undefined") alert("not loaded"); 创建了 doAlert
【解决方案2】:

我知道已经很晚了。但是有很简单的方法可以从控制器发送 JavaScript。

 @Html.Raw("<script>" + @ViewBag.DynamicScripts + "</script>")

在控制器中发送 JavaScript 如下:

 ViewBag.DynamicScripts = "alert('test');";

【讨论】:

    猜你喜欢
    • 2010-11-27
    • 1970-01-01
    • 2016-05-05
    • 2017-06-11
    • 2010-11-29
    • 1970-01-01
    • 1970-01-01
    • 2013-08-23
    • 1970-01-01
    相关资源
    最近更新 更多