2009-12-07 141 views
0

我在嘗試更新一個基於某些Ajax代碼來控制滾動腳本的Javascript變量。當Ajax腳本中的條件爲真時,Ajax代碼應該添加到JS Var中。有什麼辦法可以觸發這個嗎?是否可以從Ajax響應中更改Javascript變量?

謝謝!

編輯:我不確定如何更改變量的值。我試着通過Ajax來改變它,但它不會被解析。我也嘗試使用JS內部的PHP來檢查一個條件,但這樣做只能工作一次。

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 CODE

<?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']; 

} 



?> 
+0

也許您有範圍問題?您的處理程序是否無法「找到」要更新的變量? – Upperstage 2009-12-07 19:20:23

回答

1

假設在不同的命名空間,沒有提供接口的變量沒有被鎖定了,那麼當然。

「Ajax」只是表示「使用JS從服務器獲取一些數據而不離開頁面,然後運行一些JS」。

沒有什麼特別的東西給JS可​​以做什麼增加額外的限制。

0

我也遇到了一些問題。可能命名空間問題像另一個答案在這裏表明。
而不是搞清楚什麼/時/爲什麼,我只是用<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"); 
+0

我試過類似的。我有一個隱藏的輸入被設置爲調用我需要更改變量的函數,但是,我無法弄清楚如何調用它。 () – James 2009-12-07 17:50:19

+0

我看不到一個onclick事件會如何幫助您隱藏字段。我的意思是把隱藏的領域本身變成變量。 – 2009-12-07 18:10:50

+0

我從頭編碼。 – James 2009-12-07 18:50:07

相關問題