Можно ли изменить переменную Javascript из ответа Ajax? - PullRequest
0 голосов
/ 07 декабря 2009

Я пытаюсь обновить переменную Javascript, которая управляет сценарием прокрутки на основе некоторого кода Ajax. Предполагается, что Ajax-код добавляется в JS Var, когда в сценарии Ajax выполняются условия. Есть ли способ вызвать это?

Спасибо!

edit : Я не уверен, как изменить значение переменной. Я пытался изменить его через Ajax, но он не анализируется. Я также пытался использовать PHP внутри JS для проверки условия, но это работает только один раз.

Код JS

function speedUp()
    {
    actualheight = actualheight + 50;
    }

function slowDown()
{
actualheight = actualheight - 50;
}

function ajaxFunction()
{
var xmlhttp = createRequestObject();
xmlhttp.onreadystatechange=function()
{
if(xmlhttp.readyState==4)
  {
   document.getElementById('iemarquee').innerHTML=xmlhttp.responseText;
   document.getElementById('iemarquee2').innerHTML=xmlhttp.responseText;
  }
}
xmlhttp.open("GET","saleCallTest.php",true);
xmlhttp.send(null);
}

/*
Cross browser Marquee II- © Dynamic Drive (www.dynamicdrive.com)
For full source code, 100's more DHTML scripts, and TOS, visit http://www.dynamicdrive.com
Modified by jscheuer1 for continuous content. Credit MUST stay intact for use
*/

//Specify the marquee's width (in pixels)
var marqueewidth="500px"
//Specify the marquee's height
var marqueeheight="500px"
//Specify the marquee's marquee speed (larger is faster 1-10)
var marqueespeed=1
//Specify initial pause before scrolling in milliseconds
var initPause=1000
//Specify start with Full(1)or Empty(0) Marquee
var full=1
//Pause marquee onMousever (0=no. 1=yes)?
var pauseit=0
//Specify Break characters for IE as the two iterations
//of the marquee, if text, will be too close together in IE
var iebreak='<p></p>'

//Specify the marquee's content
//Keep all content on ONE line, and backslash any single quotations (ie: that\'s great):

var marqueecontent='<?php for($i=0;$i<=count($saleItems);$i++)
{
if ($saleItems[$i]['stateOfItem'] =="Sold" || $saleItems[$i]['stateOfItem'] =="Unsold")
{
$_SESSION['countItems']++;

echo $saleItems[$i]['itemNumber'];
echo $saleItems[$i]['stateOfItem'] . '<br />';

}};
?>'


////NO NEED TO EDIT BELOW THIS LINE////////////
var copyspeed=marqueespeed
var pausespeed=(pauseit==0)? copyspeed: 0
var iedom=document.all||document.getElementById
var actualheight=''
var cross_marquee, cross_marquee2, ns_marquee

function populate(){
if (iedom){
var lb=document.getElementById&&!document.all? '' : iebreak
cross_marquee=document.getElementById? document.getElementById("iemarquee") : document.all.iemarquee
cross_marquee2=document.getElementById? document.getElementById("iemarquee2") : document.all.iemarquee2
cross_marquee.style.top=(full==1)? '8px' : parseInt(marqueeheight)+8+"px"
cross_marquee2.innerHTML=cross_marquee.innerHTML=marqueecontent+lb
actualheight=cross_marquee.offsetHeight
cross_marquee2.style.top=(parseInt(cross_marquee.style.top)+actualheight+8)+"px" //indicates following #1

}
else if (document.layers){
ns_marquee=document.ns_marquee.document.ns_marquee2
ns_marquee.top=parseInt(marqueeheight)+8
ns_marquee.document.write(marqueecontent)
ns_marquee.document.close()
actualheight=ns_marquee.document.height

}
setTimeout('lefttime=setInterval("scrollmarquee()",20)',initPause)
}
window.onload=populate

function scrollmarquee(){

if (iedom){
if (parseInt(cross_marquee.style.top)<(actualheight*(-1)+8))
cross_marquee.style.top=(parseInt(cross_marquee2.style.top)+actualheight+8)+"px"
if (parseInt(cross_marquee2.style.top)<(actualheight*(-1)+8))
cross_marquee2.style.top=(parseInt(cross_marquee.style.top)+actualheight+8)+"px"
cross_marquee2.style.top=parseInt(cross_marquee2.style.top)-copyspeed+"px"
cross_marquee.style.top=parseInt(cross_marquee.style.top)-copyspeed+"px"
}

else if (document.layers){
if (ns_marquee.top>(actualheight*(-1)+8))
ns_marquee.top-=copyspeed
else
ns_marquee.top=parseInt(marqueeheight)+8
}
}

if (iedom||document.layers){
with (document){
if (iedom){
write('<div style="position:relative;width:'+marqueewidth+';height:'+marqueeheight+';overflow:hidden" onMouseover="copyspeed=pausespeed" onMouseout="copyspeed=marqueespeed">')
write('<div id="iemarquee" style="position:absolute;left:0px;top:0px;width:100%;background:black;color:white;font-size:30pt;">')
write('</div><div id="iemarquee2" style="position:absolute;left:0px;top:0px;width:100%;z-index:100;background:black;color:white;font-size:30pt;">')
write('</div></div>')

}
else if (document.layers){
write('<ilayer width='+marqueewidth+' height='+marqueeheight+' name="ns_marquee">')
write('<layer name="ns_marquee2" width='+marqueewidth+' height='+marqueeheight+' left=0 top=0 onMouseover="copyspeed=pausespeed" onMouseout="copyspeed=marqueespeed"></layer>')
write('</ilayer>')
}
}
}


</script>

AJAX-> PHP-код

<?php
session_start();

//NuSoap Library
require_once('./lib/nusoap.php');
$_SESSION['countTotal'] = 0;

//Creating a Client
$client = new nusoap_client('http://xx.xx.x.xxx:xxxx/WSSERVICE/services/SERVICE?WSDL');



$saleItems= $client->call("getItems", array("Sale" => '001'));

$_SESSION['countNew'] = 0;


$countPresale = count($saleItems);
$timer = $countPresale * 3.15;

 for($i=0;$i<=count($saleItems);$i++)
{
if ($saleItems[$i]['stateOfItem'] =="Sold" || $saleItems[$i]['stateOfItem'] =="Unsold")
{
$_SESSION['countNew']++;

echo $saleItems[$i]['itemNumber'];
echo $saleItems[$i]['stateOfItem'] . '<br />';

}};

if($_SESSION['countNew'] < $_SESSION['countVehicles'])
{
$_SESSION['countTotal']--;
}

if($_SESSION['countNew'] > $_SESSION['countVehicles'])
{
$_SESSION['countTotal']++;
}


if($_SESSION['countTotal'] < 0)
{
$opx = 3 * ($_SESSION['countItems'] - $_SESSION['countNew']);
echo 'actualheight = parseInt(actualheight) + parseInt(' . $opx . ');';
$_SESSION['countVehicles'] = $_SESSION['countNew'];

}

if($_SESSION['countTotal'] > 0)
{
$opx = 3 * ($_SESSION['countItems'] + ($_SESSION['countNew'] - $_SESSION['countNew']));
echo 'actualheight = parseInt(actualheight) - parseInt(' . $opx . ');';
$_SESSION['countItems'] = $_SESSION['countNew'];

}



?>

Ответы [ 2 ]

1 голос
/ 07 декабря 2009

Если предположить, что переменная не заблокирована в другом пространстве имен без доступного интерфейса, то, конечно,

«Ajax» означает «получить некоторые данные с сервера, используя JS, не покидая страницу, а затем запустить JS».

Нет ничего особенного, что добавляет дополнительные ограничения к тому, что может делать JS.

0 голосов
/ 07 декабря 2009

Я тоже столкнулся с некоторыми проблемами. Вероятно, проблемы с пространством имен, как здесь предлагается в другом ответе.
Вместо того чтобы выяснить, что / когда / почему, я просто использовал <input name="blah" type=hidden>, а затем обновил и прочитал это с помощью Javascript:

Затем, чтобы написать переменную: document.getElementById('blah').value='some new value';

Чтобы прочитать переменную: somevar=document.getElementById('blah').value;

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

РЕДАКТИРОВАТЬ: Используете ли вы какие-либо библиотеки Javascript, чтобы сделать ваш AJAX для вас, или просто кодируете его с нуля? Я использовал xajax, Prototype и Jquery для таких вещей. Jquery - мой новый ребенок, но 5 лет назад это было очень просто в xajax.

Я не уверен, что хочу направить вас по этому пути, но для программиста php xajax - довольно простой метод для изучения. Jquery более мощный и расширяемый, хотя, на мой взгляд.

РЕДАКТИРОВАТЬ2: Насколько я могу судить, вы возвращаете и HTML и JavaScript для выполнения в одном ответе. Включение JavaScript в ваш ответ не делает его выполненным. Возможно, вам следует сериализовать ваш возврат с JSON, чтобы вы могли оценить свой javascript для выполнения и назначить свой innerHTML отдельно. Просто для справки, то же самое, что вы могли бы сделать в xajax просто:

$objResponse->addAssign("idhere","innerHTML", "some html");
$objResponse->addScript("somvar = somevar + someothervar");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...