Javascript中的C#代码只运行一次!

时间:2011-02-15 14:43:24

标签: c# javascript youtube-api

我想向正在观看视频的用户发送电子邮件。

所以我有一个像以下的JavaScript代码:

var n = 0 ;
//this is the Youtube EventHandler method which will get the new state of Youtube player
function OnStateChange(newState)
{
     // 1 means the player is playing video.
     if(newState == 1)
     {
          <% send(); %>
          document.getElementById("counter").innerHTML =  ++n; 
     }
}

我在HTML主体中有一个div

<div id="counter"></div>

send()方法是一个C#函数,它向某人发送电子邮件。

我想每次,当玩家正在玩时,应该会有一封电子邮件发送给某人。 但是,它只运行一次,这是加载页面时的fisrt时间。

在那之后,我打开了萤火虫,看看那里有什么。但我所看到的是

var n = 0 ;
//this is the Youtube EventHandler method which will get the new state of Youtube player
function OnStateChange(newState)
{
     // 1 means the player is playing video.
     if(newState == 1)
     {
          //there is nothing >_<;;;
          document.getElementById("counter").innerHTML =  ++n; 
     }
}

所以我的问题是如何在播放器状态为1(播放)时每次运行send()?

提前致谢。

4 个答案:

答案 0 :(得分:3)

在渲染页面时(页面加载前)运行C#

您必须在JavaScript的OnStateChange函数中使用对服务器的AJAX调用

答案 1 :(得分:3)

您无法从客户端代码(JavaScript代码)调用服务器端代码(C#代码)。

不是你想要的方式。

您必须在if (newState === 1)内触发某种AJAX回调,并处理事件服务器端。

哦,顺便说一下:这样做会在每次停顿并重新开始播放时向人们发送垃圾邮件。不太好。您应该执行检查以仅发送一次电子邮件。

答案 2 :(得分:1)

<% send(); %>部分不是神奇的代码,浏览器可以执行服务器端代码。 它是服务器端指令:在呈现页面(包括javascript)时,这将在文本发送到客户端之前在服务器上执行。

在您的情况下,该电子邮件始终在用户看到该页面之前发送,并且可能会更改该状态。

答案 3 :(得分:0)

为了省去AJAX的麻烦,你可以使用旧的诡计。

首先,将隐藏的表单字段和隐藏的iframe添加到.aspx代码中:

<input type="hidden" name="Send" value="0" />
<iframe name="SendFrame" style="display: none;"></iframe>

其次,改为使用这样的JS代码:

if(newState == 1)
{
   document.forms[0].elements["Send"].value = "1";
   document.forms[0].target = "SendFrame";
   document.forms[0].submit();
   document.getElementById("counter").innerHTML =  ++n; 
}

最后在你的C#代码后面有Page_Load方法:

if (Request.Form["Send"] == "1")
   send();

编辑:先解释一下。上面的代码更改了 target 形式,使其自身提交到隐藏框架而不是当前页面,这是默认行为。这导致“类似AJAX”的结果,而不使用“真正的”AJAX。为什么?因为数据是从浏览器发送到服务器而没有用户看到任何内容而没有页面重新加载。这就是我在AJAX存在之前所做的事情。

现在,如果您需要在页面中使用PostBack,它将不再起作用,因为表单仍会将自身发布到框架,因此数据“丢失”。解决方案正在改变目标...因为在提交表单后立即更改它可能会导致问题计时器是IMO的最佳方式,并且修改后的代码是:

if(newState == 1)
{
   document.forms[0].elements["Send"].value = "1";
   document.forms[0].target = "SendFrame";
   document.forms[0].submit();
   window.setTimeout(function() { document.forms[0].target = ""; }, 1000);
   document.getElementById("counter").innerHTML =  ++n; 
}

这将在一秒钟后将目标设置为空,允许在同时将表单提交到隐藏帧。

最后你会问“为什么老技巧而不是新手”?因为它可以在不使用任何其他代码库的情况下工作。它与任何现代AJAX解决方案一样是跨浏览器。问题的理想解决方案是告诉您在代码中包含jQuery,然后修改后的代码将只有这样:

if(newState == 1)
{
   $.post(document.forms[0].action, { "Send": "1" });
   document.getElementById("counter").innerHTML =  ++n; 
}

并拥有相同的服务器端代码。就个人而言,我认为你不需要为这一件事包含整个jQuery库,就像购买5L水容器一样,只需要一杯 - 但这当然是你的选择。 :)

编辑II:关于.ashx这是“倾听”我们在这里做的事情的标准方式:不是将“发送”发布到同一页面,理想的方式是将其发送到{{1监听器并让代码在那里发送邮件。如果你愿意,请阅读看起来很棒的this tutorial,当你准备好做更多时,请回来。 ;)