iT邦幫忙

0

jquery將參數轉為字串

如題 我有幾段程式碼如下

$.getJSON("data/songlist.json"+query,
		function(g)
		{
			music_total=g.total_size;
			song_json=g.songlist;
			song_length=song_json.length;
			
			song_html="<table class=list><tr><th  width=3%></th><th width=25%>歌手</th><th width=30%>歌名</th><th width=40%>專輯</th><th width=3%>時間</th></tr>";
			for(s=0;s<song_length-1;s++)
			{
				var charA=String(song_json[s].artist);
				var charB=String(song_json[s].title.substr(0,2));
				song_html+="<tr>";
				song_html+="<td>"+(s+1)+"</td>";
				song_html+='<td><a href="javascript:void(0)" onclick="artist_name(\''+song_json[s].artist.replace(/'/g,"\\'")+"');return false;\"> ";
				song_html+=song_json[s].artist+"</a></td>";
				song_html+='<td><a id="request" href="javascript:void(0)" onclick="check('+charA+","+charB+');return false;" title=>'+song_json[s].title+"</a></td>";
				song_html+='<td><a href="javascript:void(0)" onclick="album_name(\''+song_json[s].album.replace(/'/g,"\\'")+'\');return false;\"> ';
				song_html+=song_json[s].album+"</a></td>";
				
				song_html+="<td>"+song_json[s].length+"</td>";
				song_html+="</tr>";
			}
			
			song_html+="</table>";
			
			$("#song_list").html(song_html);
function check(ca,ct)
{
	$.getJSON("data/requestlist.json",
		function(b)
		{	
			var request_json=b.requestlist;
			var request_length=request_json.length;
			var n=1;
			var count=0;
			var oa,ot,na,nt,de,count;
			
			for(q=0;q<request_length-1;q++)
			{
			oa=request_json[q].artist;
			ot=request_json[q].title.substr(0,2);
			count=0;
				for(i=n;i<request_length-1;i++) 
				{
					na=request_json[i].artist;
					nt=request_json[i].title.substr(0,2);
					if(ot==nt||ct==nt)
					{
						err=1;
					}
					else if(oa==na||ca==na)
					{
						count++;
						if(count>=3)
						{
							err=1;
						}
					}
				}
				n++;
			}
		}
	)	
}
if(err!=1)
{
function request(f,b,d)
{
	var e;
	if(d)
	{
		if(d=="rem")
		{
			e="?cmd=remove&list_id="+f+"&song_id="+b;
		}
	}
	else
	{
		e="?cmd=request&list_id="+f+"&song_id="+b;
	}
	
	$.getJSON("data/message.json"+e,
	
	function(g)
	{
		if(g.max_request_num==0){
			$("#message").html("點播系統已關閉,請稍後再點播");
		}
		else if(g.message=="Request accepted."){
			$("#message").html("歌曲已點播完成");
		}
		else if(g.message==" This song played recently. Please wait ."){
			$("#message").html("這首歌曲最近已經播過了。請耐心等待。");
		}
		else if(g.message==" This song not requested."){
			$("#message").html("歌曲點播失敗");
		}
		else if(g.message==" Remove request."){
			$("#message").html("已取消點播歌曲");
		}
		else if(g.message==" Requested song not found."){
			$("#message").html("找不到要點播的歌");
		}
		else if(g.message==" Requests have reached max per ip."){
			$("#message").html("您的點播數已超過個人能點播的最大數量。請耐心等待。");
		}
		else if(g.message==" This song already requested."){
			$("#message").html("這首歌曲已經被點播了");
		}
		else if(g.message==" Requests have reached max."){
			$("#message").html("點播歌單已滿。請耐心等待。");
		}
		else{
			$("#message").html(g.message);
		}
			req_settimeout=setTimeout(requestlist_call(),100)
		}
	);
	
	$("#message").show();
	info_call();
	return false;
}
}

現在我想利用check函數去觸發後面的檢查 可是一直出現undefind 想請問該如何解決這問題

1 個回答

2
神Q超人
iT邦新手 2 級 ‧ 2018-08-20 16:53:14
最佳解答

問題應該是出在onclick="check('+charA+","+charB+')check需要兩個參數,可是這樣子的話只會傳一個過去,因為單引號沒有成雙的關係,可以把它改成這樣子:

onclick="check('"+charA+"','"+charB+"')

如果有問題可以在下方留言告訴我,謝謝/images/emoticon/emoticon41.gif

看更多先前的回應...收起先前的回應...

出現Unexpected string

大大您的JavaScript

song_html+='<td><a id="request" href="javascript:void(0)" onclick="check('+charA+","+charB+');return false;" title=>'+song_json[s].title+"</a></td>";

首尾的單雙引號不同!要在檢查一下有沒有下錯的地方

改成下方這樣看看。

song_html+='<td><a id="request" href="javascript:void(0)" onclick="check("'+charA+'","'+charB+'");return false;" title=>'+song_json[s].title+"</a></td>";

Unexpected end of input 不過這次網頁有出來了 感覺應該快了

我有點亂掉了XD 等我一下下

改成這樣子吧!

song_html+='<td><a id="request" href="javascript:void(0)" onclick="check(\''+charA+'\',\''+charB+'\');return false;" title=>'+song_json[s].title+"</a></td>";

因為看得有點亂,所以直接用跳脫字元處理XD
跳脫字元是\把單引號或雙引號放他後面的話,就會被當成一般的字元處理,加進字串中!
如果有問題可以在下方留言告訴我,不好意思看有點久XD

恩 似乎是沒錯誤了 不過後面的函式好像沒觸發到
好像是request的fbd沒傳過去

大大您可以先把check這個函式改成下方這樣子,看有沒有觸發:

function check(strA,strB){
    alert(strA + ',' + strB);
}

有觸發 啊對了我把request需要的也加進去好了
還是要直接把request寫進check裡

那應該是check裡面的問題了,
可以用開發者模式看一下是哪一行出錯,
這樣會比較好修改。

而且我剛剛發現,大大每個tdid都是request@@

不是 現在check沒問題了 只是沒有值傳去request所以無法觸發
request需要的是另兩個值:list_id song_id

改成這樣不知道傳不傳的過去

function check(ca,ct,f,b,d)
{
	$.getJSON("data/requestlist.json",
		function(b)
		{
			var request_json=b.requestlist;
			var request_length=request_json.length;
			var n=1;
			var count=0;
			var oa,ot,na,nt,de,count;
			
			for(q=0;q<request_length-1;q++)
			{
			oa=request_json[q].artist;
			ot=request_json[q].title.substr(0,2);
			count=0;
				for(i=n;i<request_length-1;i++) 
				{
					na=request_json[i].artist;
					nt=request_json[i].title.substr(0,2);
					if(ot==nt||ct==nt)
					{
						err=1;
					}
					else if(oa==na||ca==na)
					{
						count++;
						if(count>=3)
						{
							err=1;
						}
					}
					else
					{
						request(f,b,d)
					}
				}
				n++;
			}
		}
	)	
}

好像傳不過去

大大您說要加兩個但是參數多了三個耶!
他應該是都傳的到function裡面,
只是onclick那邊也要記得加入才行!

啊忘了說還有個是控制移除的
onclick現在改這樣 似乎還是沒功能

song_html+='<td><a id="request" href="javascript:void(0)" onclick="check(\''+charA+'\',\''+charB+'\','+song_json[s].list_id+","+song_json[s].song_id+');return false;" title=>'+song_json[s].title+"</a></td>";

您還是沒有加跳脫字元XD
改成下方這樣子吧!另外單引號和雙引號混用容易讓人眼花XD

song_html+='<td><a id="request" href="javascript:void(0)" onclick="check(\''+charA+'\',\''+charB+'\',\''+song_json[s].list_id+'\',\'' +song_json[s].song_id+'\');return false;" title=>'+song_json[s].title+"</a></td>";

list_id song_id是數字不用加引號 不知道是不是這個的問題

合併後值是能傳過去了 不過功能還出不來 能教教我嗎

您是想做到那些事情,然後現在卡在哪裡呢?

我是想做個檢查系統在點擊時觸發 如果違反規則就阻斷 目前程式碼如下:

function request(ca,ct,f,b,d)
{
	$.getJSON("data/requestlist.json",
	function(b)
	{
		var request_json=b.requestlist;
		var request_length=request_json.length;
		var oa,ot,na,nt,de,count;
			
		for(q=0;q<request_length-1;q++)
		{
		oa=request_json[q].artist;
		ot=request_json[q].title.substr(0,2);
		count=0;
			for(i=0;i<request_length-1;i++) 
			{
				na=request_json[i].artist;
				nt=request_json[i].title.substr(0,2);
				if(ot==nt||ot==ct)
				{
					err=1;
				}
				else if(oa==na||oa==ca)
				{
					count++;
					if(count>=3)
					{
						err=1;
					}
				}
			}
		}
	}
	)
	
	if(err==1)
	{
		e=0;
	}
	else
	{
		e="?cmd=request&list_id="+f+"&song_id="+b;
	}
	if(d)
	{
		if(d=="rem")
		{
			e="?cmd=remove&list_id="+f+"&song_id="+b;
		}
	}
	
	if(e!=0)
	{
	$.getJSON("data/message.json"+e,
	
	function(g)
	{
		if(g.max_request_num==0){
			$("#message").html("點播系統已關閉,請稍後再點播");
		}
		else if(g.message=="Request accepted."){
			$("#message").html("歌曲已點播完成");
		}
		else if(g.message==" This song played recently. Please wait ."){
			$("#message").html("這首歌曲最近已經播過了。請耐心等待。");
		}
		else if(g.message==" This song not requested."){
			$("#message").html("歌曲點播失敗");
		}
		else if(g.message==" Remove request."){
			$("#message").html("已取消點播歌曲");
		}
		else if(g.message==" Requested song not found."){
			$("#message").html("找不到要點播的歌");
		}
		else if(g.message==" Requests have reached max per ip."){
			$("#message").html("您的點播數已超過個人能點播的最大數量。請耐心等待。");
		}
		else if(g.message==" This song already requested."){
			$("#message").html("這首歌曲已經被點播了");
		}
		else if(g.message==" Requests have reached max."){
			$("#message").html("點播歌單已滿。請耐心等待。");
		}
		else{
			$("#message").html(g.message);
		}
			req_settimeout=setTimeout(requestlist_call(),100)
		}
	);
	}
	
	$("#message").show();
	info_call();
	return false;
}

$.getJSON("data/requestlist.json",那段就是檢查系統
不過沒辦法用出我想要的功能

你有下中斷點或寫console看看程式是跑在哪邊停掉的嗎?
如果有的話我應該比較好知道問題出在哪。

好像是提早err變1的樣子 而且聽另一個有再開台的說這程式碼似乎不能用了 需要提供原始檔跟環境嗎這樣你比較好測試

會讓err變1的情況應該只有這裡,可以確認是不是有不小心跑進去了

if(ot==nt||ot==ct)
{
    err=1;
}
else if(oa==na||oa==ca)
{
    count++;
    if(count>=3)
    {
        err=1;
    }
}

是這裡沒錯 可是我也想不到要怎改了 昨天光是想了上面那些就已經絞盡腦汁了 還是給你原始碼跟環境讓你直接改吧

不然至少給個方向 讓我比較好改

我可以告訴你該怎麼做,
但是我無法幫你寫/images/emoticon/emoticon37.gif

目前就是先跟著程式跑,看過程是不是和想像中一樣,
可以下alert()或是console.log()確認變數的值!

恩 我先去用看看

先一個一個慢慢來吧 現在程式碼長這樣 目前是點了兩手同歌曲後會擋 可是我想要點了一首後就預擋第二首

$.getJSON("data/requestlist.json",
	function(b)
	{
		var request_json=b.requestlist;
		var request_length=request_json.length;
		var oa,ot,na,nt,de,count;
			
		for(q=0;q<request_length-1;q++)
		{
		oa=request_json[q].artist;
		ot=request_json[q].title.substr(0,2);
		count=0;
		if(ot==ct)
		{
			err=1;
		}
		}
	}
	)

方便下一下註解嗎?
因為看不太出各個變數是在做什麼的/images/emoticon/emoticon06.gif

剛改了一下大致上功能是出來了

function request(ca,ct,f,b,d)
{
	$.getJSON("data/requestlist.json",
	function(b)
	{
		var request_json=b.requestlist;
		var request_length=request_json.length;
		var oa,ot,na,nt,de,count;
			
		for(q=0;q<request_length-1;q++)
		{
		oa=request_json[q].artist;
		ot=request_json[q].title.substr(0,2);
		count=0;
		if(ot==ct)
		{
			err=1;
			alert("Fail!");
			return false
		}
		else
		{
			pass=true;
		}
		count=0;
			for(i=0;i<request_length-1;i++) 
			{
				na=request_json[i].artist;
				nt=request_json[i].title.substr(0,2);
				if(oa==na)
				{
					count++;
					if(count>=2)
					{
						if(oa==ca&&count>=3)
						{
							err=1;
							alert("Fail!");
							return false
						}
						else
						{
							pass=true;
						}
					}
				}
			}
		}
	}
	)
	
	if(err==1)
	{
		e=0;
	}
	else if(pass)
	{
		e="?cmd=request&list_id="+f+"&song_id="+b;
	}
	if(d)
	{
		if(d=="rem")
		{
			e="?cmd=remove&list_id="+f+"&song_id="+b;
		}
	}
	
	if(e!=0)
	{
	$.getJSON("data/message.json"+e,
	
		function(g)
		{
			if(g.max_request_num==0){
				$("#message").html("The request system is closed, Please try again later.");
			}
			else{
			$("#message").html(g.message);
			}
			req_settimeout=setTimeout(requestlist_call(),100)
		}
	);
	}
	
	$("#message").show();
	info_call();
	return false;
}

不過有個有個問題 就是第一次點播一定要點兩下才有反應

恭喜你啊!
不過我還是看不太懂程式碼XD

這個建議是搭配環境比較好理解XD
http://ac1011.hopto.org:4095/en_index.html

您是說點哪裡不會播放?

您會點播嗎 要點歌名那欄的藍色連結哦

我要發表回答

立即登入回答