
27-10-2006, 08:08
|
|
|
|
חבר מתאריך: 25.08.03
הודעות: 9,114
|
|
|
העברת מחרוזת ארוכה מפונקציית AS לפונקציית JS
יש לי את הקוד הבא:
קוד PHP:
btn.onRelease = function() {
bitmap.draw(myCam);
pic = new Array();
for (i=0; i<160; i++) {
for (j=0; j<120; j++) {
pic.push(bitmap.getPixel(j, i));
}
}
proxy.call("cameraSendPic", pic.join(","));
};
bitmap = אובייקט המכיל תמונה בגודל 160*120 פיקסלים.
1. אני עובר בלולאה על פיקסל אחר פיקסל ודחוף את המידע על כל פיקסל לתוך המערך pic.
2. באמצעות השיטה call של האובייקט proxy אני שולח את המחרוזת (של המערך pic) לפונקציית JS בשם cameraSendPic.
אורך/גודל המחרוזת:- בד"כ המספר המייצג את המידע על כל פיקסל הוא באורך 7 ספרות
- התו פסיק שהוא תו ההפרדה בין המידע של פיקסל אחד למשנהו מעלה את אורך המחרוזת עבור כל תו ל-8
- 8 תווים * 160 פיקסלים לרוחב * 120 פיקסלים לגובה = 153600 תווים אורך המחרוזת = 150kb
- אני מתכונן להעביר את הנתון כמידע בינארי ובכך להקטין את אורך המחרוזת ונפח המידע בלמעלה מ-60 אחוז, אך לא זאת הבעיה כרגע.
בשורה התחתונה:
פונקציית ה-AS קוראת ומעבירה לפונקציית JS פרמטר שאורכו עשוי להגיע למעל 150,000 תווים!
בשועלי החביב הכל פועל כמובן כשורה, אך באיכספלורר כצפוי העניינים לא חלקים במיוחד.
אני מעריך שהבעיה באקספלורר נובעת מגודל המשתנה, כיון שכשהשארתי את הקוד כמות שהוא, אך שיניתי אותו כך שיעביר רק את הנתונים של x פיקסלים (באורך מחרוזת כולל של פחות מ-500 תווים) הכל פעל כשורה.
אשמח לשמוע רעיונות איך להתגבר על הבעיה. או הצעה לדרכים חילופיות להעביר את הנתון מהפחאש לתוך משתנה JS.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
פתרון אחד שנסיתי הוא לשלוח בכל פעם מחרוזת קצרה שתצבר במשתנה JS ולסיום לשלוח false.
הקוד:
קוד PHP:
btn.onRelease = function() {
bitmap.draw(myCam);
for (h=0; h<120; h++)
{
pic = new Array();
for (w=0; w<160; w++)
pic.push(bitmap.getPixel(w, h));
proxy.call("cameraTempPic", pic.join());
}
proxy.call("cameraTempPic", false);
};
אך גם זה פועל רק בשועל.
בדקתי באקספלורר ונראה כי הפונקציה cameraTempPic נקראת רק פעם אחת ובאותו פעם מקבלת את הערך false, מה שגורם לתמיה מדוע לא מתבצעת כל קריאה לפונקציה במהלך ריצת הלולאות ?!
אני מזכיר שוב, בשועל הכל! עובד חלק, כך שהקוד תקין לחלוטין.
האם יתכן שקוד ה-AS פועל בצורה שונה בדפדפנים שונים ???
אני מצרף את קוד הפונקציה cameraTempPic למקרה שמישהו יתעניין בה:
קוד:
function cameraTempPic(pic)
{
alert(pic);
if(pic !== false)
cameraTemp += pic + ",";
else {
cameraSendPic(cameraTemp);
cameraTemp = "";
}
}
|