RT 我有段浮動圖片程式碼長這樣
function float_call()
{
$.getJSON("data/complex.json",
function(b)
{
var request_json=b.requestlist;
request_length=request_json.length;
p=1;
h=130;
request_html="";
for(q=0;q<3;q++)
{
var firstpath="cover/";
var coverpath=encodeURIComponent(request_json[q].coverpath).replace(/[%A-F8]/g,"").substring(12,210);
var endpath="Cover.jpg";
request_html+="<img id=p"+p+" height="+h+"px width="+h+"px src="+firstpath+coverpath+endpath;
request_html+="></img>";
request_html+='<p id=message-float'+p+' style=display:none>歌手:'+request_json[q].artist+"<br>";
request_html+="歌名:"+request_json[q].title+"<br>";
request_html+='專輯:'+request_json[q].album+"<br>";
request_html+="時間:"+request_json[q].length+"</p>";
h=h-(10*p);
p++;
}
request_html+="";
$("#cover-float").html(request_html);
$("#apDivp1").click(function(){
$("#p1").removeAttr('style');
$("#p2").removeAttr('style');
$("#p3").removeAttr('style');
$("#p1").animate({left:'10px'});
$("#p2").animate({right:'110px'});
$("#p3").animate({right:'10px'});
$("#message-float1").animate({opacity:'show'});
$("#message-float2").animate({opacity:'hide'});
$("#message-float3").animate({opacity:'hide'});
});
$("#apDivp2").click(function(){
$("#p1").removeAttr('style');
$("#p2").removeAttr('style');
$("#p3").removeAttr('style');
$("#p1").animate({right:'230px'});
$("#p2").animate({left:'10px'});
$("#p3").animate({right:'10px'});
$("#message-float1").animate({opacity:'hide'});
$("#message-float2").animate({opacity:'show'});
$("#message-float3").animate({opacity:'hide'});
});
$("#apDivp3").click(function(){
$("#p1").removeAttr('style');
$("#p2").removeAttr('style');
$("#p3").removeAttr('style');
$("#p1").animate({right:'230px'});
$("#p2").animate({right:'110px'});
$("#p3").animate({left:'10px'});
$("#message-float1").animate({opacity:'hide'});
$("#message-float2").animate({opacity:'hide'});
$("#message-float3").animate({opacity:'show'});
});
$("#p1").error(function(){
$("#cover-float").find("#p1").attr('src','/img/no.png');
});
$("#p2").error(function(){
$("#cover-float").find("#p2").attr('src','/img/no.png');
});
$("#p3").error(function(){
$("#cover-float").find("#p3").attr('src','/img/no.png');
});
}
)
}
剛去請教了另一位有在開台的問題已得到了初步解決 可是點久了還是會重疊在一起
順便問問這段程式碼能不能用迴圈或陣列之類的方式再次簡化
code還是一如往常的亂七八糟,之後維護真的會搞死自己,簡單的簡化方式,因為沒辦法跑debug,在自行跑一下,有問題再微調
var flag = true;
var coverObj = $("#cover-float");
var firstp1path = "cover/";
var endp1path = "Cover.jpg";
var sizeAry = [130, 120, 100];
var pList = [];
pList[0] = {left: '10px', right: '110px', right: '10px'};
pList[1] = {right: '230px', left: '10px', right: '10px'};
pList[2] = {right: '230px', right: '110px', left: '10px'};
var msgList = [];
msgList[0] = [ 'show', 'hide', 'hide'];
msgList[1] = [ 'hide', 'show', 'hide'];
msgList[2] = [ 'hide', 'hide', 'show'];
function clickEvent(apObj, pAry, msgAry){
apObj.click(function() {
var j = 1;
for (var key in pAry) {
var pObj = $("#p" + index);
var msgObj = $("#message-float" + index);
pObj.animate({
key: pAry[key]
});
msgObj.animate({
opacity: msgAry[j-1]
});
j++;
}
});
}
function htmlProc(b) {
var request_json = b.requestlist;
request_length = request_json.length;
request_total_time = 0;
request_total_number = 0;
request_html = "";
var q;
for (q = 0; q < 3; q++) {
var coverp1path = encodeURIComponent(request_json[q].coverpath).replace(/[%A-F8]/g, "").substring(12, 210);
var id = q + 1;
request_html = '<img id="p'+id+'" height="'+sizeAry[q]+'px" width="'+sizeAry[q]+'px" src="' + firstp1path + coverp1path + endp1path + '"></img>';
request_html += '<p id="message-float'+id+'" style="display:none">歌手:' + request_json[q].artist + "<br>";
request_html += "歌名:" + request_json[q].title + "<br>";
request_html += '專輯:' + request_json[q].album + "<br>";
request_html += "時間:" + request_json[q].length + "</p>";
}
request_html += "";
coverObj.html(request_html);
if(flag){
objProc(coverObj, pList, msgList);
flag = false;
}
}
function objProc(coverObj, pList, msgList) {
var k;
for (k = 0; k < 3; k++) {
var index = k + 1;
var apObj = $("#apDivp" + index);
clickEvent(apObj, pList[k], msgList[k]);
var pStr = "#p" + index;
$(pStr).error(function() {
coverObj.find(pStr).attr('src', '/img/no.png');
});
}
}
function float_call() {
$.getJSON("data/complex.json", htmlProc(b));
}
Unexpected token ( in line 392
第一個function(b)那裡
移除掉後又會說Cannot read property 'click' of undefined
第二個for迴圈還會導致網頁整個當掉
調整了,先前說了,你的function(b) 要拆出來獨立,有問題你要自己處理,沒有環境沒辦法幫你修正,要連修正都不會的話,誰都幫不了你~
還是一樣Cannot read property 'click' of undefined.....看來apObj必須在click前宣告
我剛有試著自己寫一個獨立函式 現在只差動作跑不出來而已了
function clickEvent()
{
$.getJSON("data/complex.json",
function(b)
{
var request_json=b.requestlist;
request_length=request_json.length;
p=1;
id=1;
h=130;
var coverObj = $("#cover-float");
var firstfpath="cover/";
var endfpath="Cover.jpg";
request_html="";
for(q=0;q<3;q++)
{
var apObj=$("#apDivp" + id);
var pObj = $("#p" + id);
var msgObj = $("#message-float" + id);
var key=id-1;
var coverfpath=encodeURIComponent(request_json[q].coverpath).replace(/[%A-F8]/g,"").substring(12,210);
request_html+="<img id=p"+p+" height="+h+"px width="+h+"px src="+firstfpath+coverfpath+endfpath;
request_html+="></img>";
request_html+='<p id=message-float'+p+' style=display:none>歌手:'+request_json[q].artist+"<br>";
request_html+="歌名:"+request_json[q].title+"<br>";
request_html+='專輯:'+request_json[q].album+"<br>";
request_html+="時間:"+request_json[q].length+"</p>";
h=h-(10*p);
p++;
id++;
}
coverObj.html(request_html);
apObj.click(function(){
pObj.animate({key: pList[key]});
msgObj.animate({opacity: msgList[key]});
});
var pList = [];
pList[0] = {left: '10px', right: '110px', right: '10px'};
pList[1] = {right: '230px', left: '10px', right: '10px'};
pList[2] = {right: '230px', right: '110px', left: '10px'};
var msgList = [];
msgList[0] = [ 'show', 'hide', 'hide'];
msgList[1] = [ 'hide', 'show', 'hide'];
msgList[2] = [ 'hide', 'hide', 'show'];
$(pObj).error(function() {
coverObj.find(pStr).attr('src', '/img/no.png');
});
}
)
}
是$.getJSON("data/complex.json" 這個不要跟處理綁在一起,id是動態的,怎麼會寫成id=1;,自己慢慢改吧,總之不要在function(b) 裡又寫一大串,不然你的code永遠難以維護~
所以你的apObj.click要放在哪才不會undefind又不會把網頁搞掛掉 還有至今我還沒看過他有一次動作過
還是把測試用檔案發給你好了這樣你也比較好debug
說真的,我很懶得看你的code,因為實在太難幫你理清了,不過給你兩個建議:
1.ES6有模版,如果你一定要用ES5,你可以用類似下面的方式去替代。
'<img id="{0}" class="{1}">'.replace("{0}", "123").replace("{1}", "active")
2.動畫部分不要用jQ做,用css的keyframes去做,這樣你只要操作class就好。這樣第一更能精準的控制效果,第二更改效果時只要去改css就好。
如果讓你們看起來很亂那還真是抱歉阿 畢竟是自學的
自己也是自學,所以跟自學無關,是你沒有花時間在基礎上,一個code改上十遍,自然就會寫得好,程式要那麼好混,那還有什麼搞頭~
我還是姑且問一下好了是哪段讓你們覺得亂
什麼等號前加號前沒加空格除外
這段code我自己讀大致上都能了解其中函意 我寫code原則上會先以寫出功能出來為第一考量 之後才會想如何簡化 效能我也會考慮 像是要我選原生的for跟jq的each我就會選前者 因為each實在是跑太慢了
先前說過了,重覆的code或邏輯不要到處寫,這是最基本的,另外html跟js不要綁在一起寫,不然你的html調整,js就要跟著動,等於整個function都要重寫,不是寫的人看懂就好,要考慮之後的維護還有功能調整的問題,寫的爛之後的時候都在搞維護就飽了,更別說功能越加越多,最後會比重頭寫還麻煩~
我並沒有像你說的時常在維護
重複的code你是說request_html這個?
如果你有想到比request_html +=更好的也能告訴我啊
其實這個維護也沒像你所說的這麼難 因為html那都是套個id而已
id如果變了也只要在最後輸出結果的地方改就好
基本上現在主要會遇到的問題就是timeout沒了 不過上次問要如何改寫也沒人給個能參考的回覆 之前有個說要改的現在也音訊全無了
btw 現在首樓的code有經過簡化且功能大致上也有了 長這樣
function clickEvent()
{
$.getJSON("data/complex.json",
function(b)
{
var request_json=b.requestlist;
request_length=request_json.length;
p=1;
h=130;
checkn=0;
request_html="";
for(q=0;q<3;q++)
{
var firstpath="cover/";
var coverpath=encodeURIComponent(request_json[q].coverpath).replace(/[%A-F8]/g,"").substring(12,210);
var endpath="Cover.jpg";
request_html+="<img id=p"+p+" height="+h+"px width="+h+"px src="+firstpath+coverpath+endpath;
request_html+="></img>";
request_html+='<p id=message-float'+p+' style=display:none>歌手:'+request_json[q].artist+"<br>";
request_html+="歌名:"+request_json[q].title+"<br>";
request_html+='專輯:'+request_json[q].album+"<br>";
request_html+="時間:"+request_json[q].length+"</p>";
h=h-(10*p);
p++;
}
request_html+="";
$("#cover-float").html(request_html);
$("#apDivp1").click(function(){
if(checkn!=1)
{
checkn=1;
$("#p2,#p3").removeAttr('style');
$("#p1").animate({left:'10px'},function(){$("#p2,#p3").removeAttr('style');});
$("#message-float1").animate({opacity:'show'});
$("#message-float2,#message-float3").animate({opacity:'hide'});
}
});
$("#apDivp2").click(function(){
if(checkn!=2)
{
checkn=2;
$("#p1,#p3").removeAttr('style');
$("#p2").animate({left:'10px'},function(){$("#p1,#p3").removeAttr('style');});
$("#message-float1,#message-float3").animate({opacity:'hide'});
$("#message-float2").animate({opacity:'show'});
}
});
$("#apDivp3").click(function(){
if (checkn!=3)
{
checkn=3;
$("#p1,#p2").removeAttr('style');
$("#p3").animate({left:'10px'},function(){$("#p1,#p2").removeAttr('style');});
$("#message-float1,#message-float2").animate({opacity:'hide'});
$("#message-float3").animate({opacity:'show'});
}
});
$("#p1").error(function(){
$("#cover-float").find("#p1").attr('src','/img/no.png');
});
$("#p2").error(function(){
$("#cover-float").find("#p2").attr('src','/img/no.png');
});
$("#p3").error(function(){
$("#cover-float").find("#p3").attr('src','/img/no.png');
});
}
)
}
最後我要說一點:至少我用這code是有功能的而不是像你一樣沒功能 我說過了我都是以用出功能為優先 我不會讓沒功能的code佔據在我的點播系統上
有沒有功能自己到這試試最快:http://ac1011.hopto.org:4095/
ES6現在不是還沒幾款瀏覽器能支援嗎
keyframe也是 這支援率
我沒辦法保證使用者一定是從IE以外的瀏覽器進來我的點播系統所以還是算了吧
簡單來說,如果你覺得code好維護,有問題就要自己想辦法解決,
如果要別人幫你,就要先把code調整成好維護的樣子,不然別人也沒辦法幫忙,
因為那等於要整個大修,沒人有那麼多時間,request_html 的處理,
不知道做法,也可以寫成function,把變數當參數傳入,總之不要寫一大串,
能包成function就要這樣做,等你把所有邏輯都依function劃分出來,
就會知道要怎麼進一步精簡了,能給的只有意見,實作還是要你自己去做。
ES6不能用,我有提供你ES5的解法也在上面啊。也有babel可以把它編譯成ES5。kksugsay的拿出來當函式也不錯。
keyframes ie11能用。
你寫太多jQ,又是影音網站,本來就該拋棄ie 11以下的版本了。
嘛 我改天再試著改看看吧 最近挺忙的 有功能的code能用就先用吧......