Код C # в Javascript запускается только один раз! - PullRequest
1 голос
/ 15 февраля 2011

Я хочу отправить электронное письмо пользователям, которые смотрят видео.

Итак, у меня есть код 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; 
     }
}

И у меня есть div в теле html

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

метод send () является функцией C #который посылает кому-то письмо.

Я думал, что каждый раз, когда игрок играет, должно быть письмо, которое будет отправлено кому-то.Однако, он запускается только один раз, что является первым временем загрузки страницы.

После этого я открыл firebug, чтобы посмотреть, что там.Но то, что я увидел, это

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; 
     }
}

Так что мой вопрос в том, как заставить send () запускаться каждый раз, когда состояние игрока равно 1 (игра)?

Спасибозаранее.

Ответы [ 4 ]

3 голосов
/ 15 февраля 2011

Нельзя вызывать код на стороне сервера (код C #) из кода на стороне клиента (код JavaScript).

Не так, как вы пытаетесь это сделать.

Вы должны запуститьсвоего рода обратный вызов AJAX внутри if (newState === 1) и обработка стороны сервера событий.

Кстати, если вы сделаете это, люди будут спамить каждый раз, когда они приостанавливают и перезапускают воспроизведение.Не хорошо.Вы должны выполнить проверку, чтобы отправить электронное письмо только один раз.

3 голосов
/ 15 февраля 2011

C # запускается при визуализации страницы (до загрузки страницы)

Вам придется использовать вызов AJAX на вашем сервере, в функции OnStateChange в вашем JavaScript

1 голос
/ 15 февраля 2011

Эта часть <% send(); %> не является магическим кодом, посредством которого браузер может выполнять код на стороне сервера. Это инструкция на стороне сервера: при отображении страницы (включая javascript) она выполняется на сервере, прежде чем текст будет отправлен клиенту.

В вашем случае это электронное письмо было отправлено всегда до того, как пользователь увидел страницу и смог изменить это состояние.

0 голосов
/ 15 февраля 2011

Чтобы избавить вас от проблем с 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 на странице, он больше не будет работать, потому что форма все еще будет отправлять себя во фрейм, чтобы данные были "потерял".Решение - вернуть цель назад, так как ее изменение сразу после отправки формы может вызвать проблемы. Таймер - это лучший способ для ИМО, а пересмотренный код:

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 только для этого, это все равно, что покупать емкость для воды 5 л, когда вам нужен только один стакан - но это, конечно, ваш выбор.:)

Редактировать II: Относительно .ashx это стандартный способ «слушать» такие вещи, как то, что мы делаем здесь: вместо публикации «Отправить» на той же странице идеальным способом является отправка.ashx слушатель и есть код отправки почты там.Если хотите, прочитайте этот урок , который выглядит превосходно, и возвращайтесь, когда будете готовы к большему.;)

...