در مورد مشکل اجرا شدن کدهای جاوااسکریپ با ای جاکس(ajax)

meim

New Member
در مورد مشکل اجرا نشدن کدهای جاوااسکریپ با ای جاکس(ajax)

من مشکلی داشتم که وقتی از ای جاکس استفاده میکردم کدهای که با جاوا اسکریپ نوشته شده بود اجرا نمی شد و جواب را در یکی از پست های این انجمن دیدم وقتی آمدم در این مورد آنجا چیزی بگذارم انگار به آن پست نمی‌شود دیگر جواب داد(بخاطر زمانی که از آن گذشته است. چرایش را درست نمیدانم) برای همین مجبور شدم این پست را بگذارم.

سلام ممنون از این که فایل را اینجا گذاشتید.
من تازه دارم سایتی درست میکنم و برای ایدم احتیاج داشتم از ای جاکس استفاده کنم و با این مشکل مواجه شدم که انگاری حل شد(تنها نمی‌دانم این برای همه‌ی کدهای جاوااسکریپ کار میکند یا نه که امیدوارم با هیچ کدی به مشکل نخورد). در این نمونه که گذاشتید انگار کل صفحه‌ی "تست"(صفحه‌ی که می‌خواهیم با آی جاکس لود شود) لود می‌شود. اگر بخواهیم تنها کلاس یا ایدی مشخصی از آن صفحه  "تست" را با آی جکس در صفحه ی اصلی لود کنیم چکار کنیم اصلن می شود این کار را با این راه حلتان انجام داد؟ (امیدوارم با css های که در صفحه ی تست استفاده کرده ایم مشکلی ایجاد نکند با فرا خواندن تنها ایدی یا کلاس.)

بعد یک سوال آیا می‌شه تابع تان را به عنوان کلاسی یا هرچیزی که نخواهیم در href آن را فراخوانی کنیم و تنها در href لینک صفحه‌ی تست را بگذاریم و آن تابع را با خاصیت دیگری روش اجرا کنیم؟ (بطور دقیقتر منظورم این هست که بتوانم از تک a استفاده کنم و آن تابع به عنوان خاصیتی از این تک عمل کتد).
-----
همچنین تا آنجای که امتحان کردم احتیاج نیست در صفحه‌ی "تست" فایلی که کد آی جاکس و تابع را نوشته اید فراخوانده شود.
 
آخرین ویرایش:

meim

New Member
کار نکردن ای جاکس با تابع ای (پلاگینگی) در Jquery

با سلام دوباره به همه‌ی دوستان
من هر کاری کردم نتوانستم آن تابع جاوااسکریپی(یا صفحه ای) که می‌خوام لود شود را لود کنم. تا کنون حدود دو هفته هست که دارم در پی راه حلش میگردم اکر کمک کنید خیلی ممنون می‌شوم. من از فایلی که در پست قبل گفتم هم استفاده کردم ولی جواب نداد. نمونه ای از چیزی که می‌خواهم را در پیوست قرار داده ام.
با سپاس
 

پیوست ها

  • ajax.zip
    2.4 کیلوبایت · بازدیدها: 15

eAmin

Well-Known Member
سلام
قبلن چندین بار در این فروم در رابطه با این مشکل بحث شده تنها اون تاپیک نبوده! این تاپیک رو مشاهده کنید.
در یک فروم دیگر هم بنده به این سوال پاسخ دادم که کدهای اصلی اون رو میتونید اینجاد مشاهده کنید:
http://forum.p30world.com/showthread.php?t=434052
کد:
function index(page){ 
    var file = 'pagess.php?page='; 
    xmlhttp.open('GET', file + page, true); 
    xmlhttp.onreadystatechange=function(){ 
        if(xmlhttp.readyState==4){
            var cacheResponse = xmlhttp.responseText;
            document.getElementById('index').innerHTML = cacheResponse;
            if (!!window.execScript) {
                window.execScript(getScript(cacheResponse));
            } else {
                eval.call(window, getScript(cacheResponse));
            } 
        }
    }
    xmlhttp.send(null); 
}

function getScript(response) {
    var scripts;
    response.replace(/<script[^>]*>([\s\S]+)<\/script>/gi, function(match, scr) {
        scripts = scr;
    });
    return scripts;
};
موفق باشید.
 
آخرین ویرایش:

meim

New Member
در مورد این مثالها مشکلی ندارم(این ها را قبلا دیده بودم) و کد (alert) اجرا می‌شود ولی آن کدهای که من می‌خواهم با همان مثال های که گذاشته اید اجرا نمی‌شود. اگر می‌شود پیوستی که قرار داده ام را نگاه کنید و اشتباه من را بگوید یا اگر امکان هست درستش کنید ممنون می‌شوم(من هنوز زیاد از کدهای جاوا اسکریپ سر در نمیارم -کمی گیج میزنم !- در این مورد گیر کردم، تاحدی با استفاده از iframe آن چیزی که می‌خواهم را بدست آوردم ولی کنترل روی آن ندارم.
 

eAmin

Well-Known Member
در روش بنده نباید فایلهای JavaScript رو از فایل خارجی لود کنید بلکه باید بصورت Inline بکار ببرید! فایلهای خارجی رو میتونید در صفحه ی index لود کنید.
بنده کد شما رو تغییر دادم، میتونید از فایل ضمیمه دانلود کنید.
 

پیوست ها

  • ajax.rar
    2.1 کیلوبایت · بازدیدها: 24

farik

Well-Known Member
با سلام..
خوب من یکم کد ajax.js رو عوض کردم..حالا کارایی که لازم دارین رو انجام میده..البته واسه من googleapi رو لود نکرد...به هر حال ببینین چطوریاست:دی..
کد:
function setAndExecute(divId, innerHTML){
var div = self.parent.document.getElementById(divId);
div.innerHTML = innerHTML;
var x = div.getElementsByTagName("script");
for(var i=0;i<x.length;i++) {
	if(x[i].src){
		alert(x[i].src);
		exeC(x[i].src);
	}else{
		eval(x[i].text);
		alert(x[i].text);
	}
}
}

function exeC(url)
{
var page_request = false
	if (window.XMLHttpRequest) // if Mozilla, Safari etc
		page_request = new XMLHttpRequest()
	else if (window.ActiveXObject)
		{ // if IE
			try 
			{
				page_request = new ActiveXObject("Msxml2.XMLHTTP")
			} 
			catch (e)
			{
				try
				{
					page_request = new ActiveXObject("Microsoft.XMLHTTP")
				}
				catch (e){}
			}
		}
	else
		return false

page_request.onreadystatechange=function()
									{
										content(page_request)
									}
page_request.open('GET', url, true)
page_request.send(null)
}

function content(page_request,content_id)
{
	if (page_request.readyState == 4 && (page_request.status==200 || window.location.href.indexOf("http")==-1)){
		alert(page_request.responseText);
		eval(page_request.responseText);
	}
}

function ajax(url,content_id,exeC)
{
var page_request = false
	if (window.XMLHttpRequest) // if Mozilla, Safari etc
		page_request = new XMLHttpRequest()
	else if (window.ActiveXObject)
		{ // if IE
			try 
			{
				page_request = new ActiveXObject("Msxml2.XMLHTTP")
			} 
			catch (e)
			{
				try
				{
					page_request = new ActiveXObject("Microsoft.XMLHTTP")
				}
				catch (e){}
			}
		}
	else
		return false

page_request.onreadystatechange=function()
									{
										loadpage(page_request,content_id)
									}
page_request.open('GET', url, true)
page_request.send(null)
}

function loadpage(page_request,content_id)
	{
		document.getElementById(content_id).innerHTML='<img src="loading.gif">&nbsp;در حال بارگذاری ...'
	if (page_request.readyState == 4 && (page_request.status==200 || window.location.href.indexOf("http")==-1))
	setAndExecute(content_id,page_request.responseText);
	}
البته میتونین با بازنویسی و افزودن سوییچ ها میتونین با سه تا تابع همه این کارها رو بکنین..که دیگه به عهده خودتون..
موفق باشید...
 

meim

New Member
ابتدا ممنون که پاسخ دادید
من به یک مشکل(یا...) باز بر خوردم . ابتدا بگویم که این فایلی که می‌گذارم به روش بالا کلی امتحان کردم ولی جواب نداد نمیدانم برای چی!(اگر امکان دارد کمک کنید ممنون می شوم، در مثال زیر برای شلوغ نشدن این حالت را که باز جواب نمی‌داد پاک کردم- تنها سی.اس.اس جواب می‌داد!)*

بعد متوجه شدم اگر همین صفحه را، که می‌خواهیم لود کنم، آدرسش را از اینترنت (به صورت آدرس کامل مثل http://sandbox.scriptiny.com/slideshow/ خود آدرس فایل html هم باشد اشکالی ایجاد نمیکند) قرار بدهیم، اصلا با این مشکل بر نمی‌خورم و احتیاج هم نیست که کدهای جاوا و سی.اس.اس هاش را در صفحه‌ی مادر/پدر هم قرار بدم (من با چند صفحه و کد امتحان کردم و در سرور آپلود کردم) هیچ مشکلی به این روش نداشتم. کسی می‌داند علت چی هست چرا در این حالت اشکالی ایجاد نمی‌کند ولی آن حالت که مستقیم آدرس درایور را بدهیم گیر میدهد؟ و می‌شود این را رفع کرد که بتوان از روی درایو هم به همین صورت فایل هامان را ایجاد و درست کنیم چون اینگونه نمی‌شود راحت باهاش کار کرد. همچنین اصلا به این صورت بارگذاری روی سرور مشکلی ایجاد نمی‌کند؟
فایل پیوست مثالی هست که از یک lightwindow استفاده کرده ام که امکان این را دارد که لینک را از داخل iframe اجرا کند. در آن، لینک اول آدرس را از طریق شبکه داده ام و در لینک دوم (همان صفحه را) از طریق درایو. لینک اول کار می‌کند ولی لینک دوم نه!!!؟

پ.ن:* راستی روش قبلی در مرور گر chrome کار نمی‌کند!
 

پیوست ها

  • lightwindow.zip
    189.1 کیلوبایت · بازدیدها: 16
آخرین ویرایش:

eAmin

Well-Known Member
ابتدا ممنون که پاسخ دادید
من به یک مشکل(یا...) باز بر خوردم . ابتدا بگویم که این فایلی که می‌گذارم به روش بالا کلی امتحان کردم ولی جواب نداد نمیدانم برای چی!(اگر امکان دارد کمک کنید ممنون می شوم، در مثال زیر برای شلوغ نشدن این حالت را که باز جواب نمی‌داد پاک کردم- تنها سی.اس.اس جواب می‌داد!)*

بعد متوجه شدم اگر همین صفحه را، که می‌خواهیم لود کنم، آدرسش را از اینترنت (به صورت آدرس کامل مثل http://sandbox.scriptiny.com/slideshow/ خود آدرس فایل html هم باشد اشکالی ایجاد نمیکند) قرار بدهیم، اصلا با این مشکل بر نمی‌خورم و احتیاج هم نیست که کدهای جاوا و سی.اس.اس هاش را در صفحه‌ی مادر/پدر هم قرار بدم (من با چند صفحه و کد امتحان کردم و در سرور آپلود کردم) هیچ مشکلی به این روش نداشتم. کسی می‌داند علت چی هست چرا در این حالت اشکالی ایجاد نمی‌کند ولی آن حالت که مستقیم آدرس درایور را بدهیم گیر میدهد؟ و می‌شود این را رفع کرد که بتوان از روی درایو هم به همین صورت فایل هامان را ایجاد و درست کنیم چون اینگونه نمی‌شود راحت باهاش کار کرد. همچنین اصلا به این صورت بارگذاری روی سرور مشکلی ایجاد نمی‌کند؟
فایل پیوست مثالی هست که از یک lightwindow استفاده کرده ام که امکان این را دارد که لینک را از داخل iframe اجرا کند. در آن، لینک اول آدرس را از طریق شبکه داده ام و در لینک دوم (همان صفحه را) از طریق درایو. لینک اول کار می‌کند ولی لینک دوم نه!!!؟

پ.ن:* راستی روش قبلی در مرور گر chrome کار نمی‌کند!
لطفا برای سوالهایی که موضوعشون با تاپیک ارتباطی نداره، یک مبحث جدید ایجاد کنید.
این مشکل بر میگرده به اینکه شما اجازه ندارید فایلهای لوکال رو در حالت "اینترنت مد" باز کنید، بخاطر بحث های امنیتی. اگر دقت کرده باشید، مرورگر اینترنت اکسپلورر هنگام باز کردن صفحه ای که درون از JavaScript استفاده کرده باشید، بالای پنجره به شما این اخطار رو میده. که این موضوع بی ربط با موضوعی که اشاره کردم نیست.

موفق باشید.
 

eAmin

Well-Known Member
البته واسه من googleapi رو لود نکرد...
یادم رفت به این موضوع هم اشاره کنم که، دلیل اینکه لود نشد اینکه شما نمی تونید بصورت معمولی درخواستهای Cross Domain رو از طریق Ajax بفرستید، که اونهم بخاطر مسائل امنیتی هست. ولی راه های استانداردی برای فرستادن در خواست های Ajax بصورت Cross domain وجود داره که می تونید با خودندن مستندات نحوه پیاده سازی اون رو یاد بگیرید.
اگر تابع exeC رو به اینصورت تغییر بدید اون مشکل حل میشه.
کد:
function exeC(url) {
    var script = document.createElement('script');
    script.type = "text/javascript";
    script.src = '' + url; // force to string
    document.getElementsByTagName('head')[0].appendChild(script);
}
موفق باشید.
 

meim

New Member
ممنون از جوابتان
من تصور کردم یا میکنم که این هم از ای‌جاکس استفاده میکنه(آخر بعد از باز کردن محتوا لود می‌شود) برای همین اینگونه می‌شود. گفتم به این مورد و این پست مربوط هست برای همین اینجا گذاشتم.
اگر این گونه(با آدرس کامل) در سایت استفاده کنیم مشکلی که ایجاد نمی‌کند؟
 

eAmin

Well-Known Member
اگر این گونه(با آدرس کامل) در سایت استفاده کنیم مشکلی که ایجاد نمی‌کند؟
مثلا چه مشکلی؟!
نه دوست عزیز اصلن مشکلی ایجاد نمیکنه مهم اینه که پروتوکل مورد استفاده file:/// نباشه و از طریق http اینکار رو انجام بدید.
 

جدیدترین ارسال ها

بالا