আমার জাভাস্ক্রিপ্ট জেএসফিডেলে কাজ করছে না কেন?


114

এই জেএসফিডালটিতে কী সমস্যা আছে তা আমি খুঁজে পাচ্ছি না ।

এইচটিএমএল:

<input type="button" value="test" onclick="test()">

javascript:

function test(){alert("test");}

এবং যখন আমি বোতামে ক্লিক করি - কিছুই ঘটেনি। কনসোলটি "পরীক্ষা সংজ্ঞায়িত হয়নি" বলে

আমি জেএসফিডাল ডকুমেন্টেশন পড়েছি - সেখানে বলা হয়েছে যে জেএস কোড যুক্ত হয়েছে <head>এবং এইচটিএমএল কোড যুক্ত করা হয়েছে <body>(সুতরাং এই জেএস কোডটি এইচটিএমএল এর চেয়ে আগের এবং এটি কাজ করা উচিত)।


প্রথম বন্ধনীর অপসারণটি সাধারণ নন-ফিডাল পরিস্থিতিতেও কাজ করবে যদিও এইচটিএমএল থেকে যতটা সম্ভব জেএসকে আলাদা করার পক্ষে এটি অবশ্যই ভাল পরামর্শ। আমি কেবল নিজেকে শৈলীর অনুমতি দিই = "প্রদর্শন: কিছুই নয়" সিএসএস ইনলাইন নং-না।
অ্যাড্রিয়ান বার্থোলোমিউ

উত্তর:


60

ফাংশনটি লোড হ্যান্ডলারের অভ্যন্তরে সংজ্ঞায়িত করা হচ্ছে এবং এইভাবে এটি একটি অন্য সুযোগে। মন্তব্যগুলিতে @ এলিস্ব্বেবেন নোট হিসাবে, আপনি এটিকে windowবস্তুটিতে স্পষ্ট করে সংজ্ঞায়িত করে এটি ঠিক করতে পারেন । আরও ভাল, তবুও, অব্যবহিতভাবে অবজেক্টটিতে হ্যান্ডলারটি প্রয়োগ করতে এটি পরিবর্তন করুন: http://jsfiddle.net/pUeue/

$('input[type=button]').click( function() {
   alert("test");   
});

এই ভাবে হ্যান্ডলারটি প্রয়োগ করে নোট করুন, ইনলাইন পরিবর্তে, আপনার এইচটিএমএলকে পরিষ্কার রাখবে। আমি jQuery ব্যবহার করছি, তবে আপনি যদি চান তবে ফ্রেমওয়ার্ক সহ বা এটি ছাড়াই বা অন্য কোনও ফ্রেমওয়ার্ক ব্যবহার করতে পারেন।


@ ইনুয়েন্ডো - জেএসফিডাল কোড / এইচটিএমএল / স্টাইল শীটের জন্য পৃথক ফ্রেম ব্যবহার করে। আপনাকে ফাংশন কলটিতে ফ্রেমটি উল্লেখ করতে হবে, তবে ফ্রেমের কোনও নাম নেই বলে এটি করার কোনও সহজ উপায় নেই। জিএসফিডাল যেভাবে কাজ করে তা এটি আসলেই একটি সমস্যা, তবে আপনার জাভাস্ক্রিপ্ট সম্পূর্ণ আলাদা রাখাই ভাল ধারণা।
tvanfosson

5
@ টভানফসন- আপনার সমাধান কাজ করে, তবে জিসফিডাল ফলাফলটি দেখানোর জন্য পৃথক ফ্রেম ব্যবহার করে না; দেখতে jsfiddle.net/Yazpj/show । এটি প্রাথমিকভাবে কাজ না করার কারণটি testকোনও onLoadফাংশনের অভ্যন্তরে সংজ্ঞায়িত হয়েছিল ; ব্যবহার window.test = function(){/*...*/}এটি পুরোপুরি ভাল কাজ করে তোলে।
এলিস্ব্বেবেন

@ এলিসববেন - আমি যদি ডিওএম পরিদর্শন করতে ফায়ারব্যাগ ব্যবহার করি তবে 4 টি পৃথক প্যানগুলির প্রতিটি পৃথক আইফ্রেমে উপস্থিত রয়েছে।
tvanfosson

1
হ্যাঁ, তবে আপনি যদি উদাহরণটি দেখানোর জন্য ব্যবহৃত একক আইফ্রেমে পরীক্ষা করে দেখেন যে আপনি এটিতে সমস্ত কোড একক পৃষ্ঠায় রেখেছেন যা ফ্রেম ব্যবহার করে না, সুতরাং এই ফ্রেমগুলি আপনার উদাহরণটি ভঙ্গ করতে পারে না। পরিশেষে showকোনো jsfiddle URL- এ দেখতে আমি কি বিষয়ে কথা বলছি: jsfiddle.net/Yazpj/show
ellisbben

100

আপনি যদি মোড়কের সেটিংটি নির্দিষ্ট না করেন তবে এটি "অনলড" এ ডিফল্ট হয়। ফলাফলগুলি লোড হওয়ার পরে সমস্ত জাভাস্ক্রিপ্টের সাথে একটি ফাংশন রান এ মোড়ানো রয়েছে। সমস্ত ভেরিয়েবলগুলি এই ফাংশনে স্থানীয় হয় সুতরাং বিশ্বব্যাপী সুযোগে এটি অনুপলব্ধ।

মোড়কের সেটিংটি "কোনও মোড়ানো নয়" এ পরিবর্তন করুন এবং এটি কাজ করবে:

http://jsfiddle.net/zalun/Yazpj/1/

আপনি কোনও ব্যবহার না করায় আমি ফ্রেমওয়ার্কটি "লাইব্রেরি নেই" তে স্যুইচ করেছি।


22

আর একটি উপায় আছে, আপনার ফাংশনটিকে এইরকম চলক হিসাবে ঘোষণা করুন:

test = function() {
  alert("test");
}

jsFiddle


বিস্তারিত

সম্পাদনা (@nnnnnn এর মন্তব্যের ভিত্তিতে)

@nnnnnn:

কেন test =(বিনা var) বললে এটি সংশোধন হবে?

আপনি যখন এই জাতীয় কোনও ক্রিয়া সংজ্ঞায়িত করেন:

var test = function(){};

ফাংশনটি স্থানীয়ভাবে সংজ্ঞায়িত করা হয় তবে আপনি যখন নিজের ফাংশনটি সংজ্ঞায়িত করেন var:

test = function(){};

testwindowশীর্ষ স্তরের স্কোপটিতে থাকা অবজেক্টে সংজ্ঞায়িত করা হয় ।

কেন এই কাজ করে?

@ জালুনের মত বলুন:

আপনি যদি মোড়কের সেটিংটি নির্দিষ্ট না করেন তবে এটি "অনলড" এ ডিফল্ট হয়। ফলাফলগুলি লোড হওয়ার পরে সমস্ত জাভাস্ক্রিপ্টের সাথে একটি ফাংশন রান এ মোড়ানো রয়েছে। সমস্ত ভেরিয়েবলগুলি এই ফাংশনে স্থানীয় হয় সুতরাং বিশ্বব্যাপী সুযোগে এটি অনুপলব্ধ।

তবে আপনি যদি এই সিনট্যাক্সটি ব্যবহার করেন:

test = function(){};

ফাংশনে আপনার অ্যাক্সেস রয়েছে testকারণ এটি বিশ্বব্যাপী সংজ্ঞায়িত হয়েছে


তথ্যসূত্র:


2
এটি সত্যিই সহজ পদ্ধিতি হ'ল আপনি কেবল জেএসফিডেলে একটি ক্ষুদ্র কোডের পরীক্ষা করছেন।
ডক করুন

কিন্তু কেন এই কাজ করে? আপনার প্রদত্ত "আরও তথ্য" লিঙ্কটি ব্যাখ্যা করে না যে সমস্যাটি স্কোপের সাথে সম্পর্কিত, বা কেন বলা test = (এটি ছাড়াই var) এটি সংশোধন করবে।
nnnnnn

@ আর 3 টিপ করুন আপনার প্রথম লিঙ্কটি যা ভাল: jsfiddle.net/R3tep/Yazpj/1406 সতর্কতা আমার জন্য কিছু করে না। আমি ক্রোমে আছি
CED

@ R3tep হ্যাঁ এটি কনসোল.লগের সাথে কাজ করে। আমি এসও-তে একটি প্রশ্ন পোস্ট করব কারণ আমি বিশ্বাস করি যে আমার কোনও সতর্কতা বাক্স যদি ইফ্রেমেসের সাথে অন্য কোনও সমস্যার সাথে যুক্ত না হয়।
সিড

1
@ R3tep আমি মনে করি আপনি আমাকে ভুল বুঝেছেন তবে আমি নিশ্চিত নই। আপনার কোডটি ভাল / ছিল। কীভাবে জেএসফিডেল কোডিং করা হয়েছে তা নিয়ে একটি সমস্যা রয়েছে (তারা ফলাফলটি প্রদর্শনের জন্য ব্যবহার করছে এমন iframe এর স্যান্ডবক্স বৈশিষ্ট্যে মান অনুপস্থিত)। এটি এটিকে এমন করে তোলে যে এটি ক্রোমের কয়েকটি সংস্করণে কাজ করবে না। আমি তাদের গিথুবে একটি ইস্যু রিপোর্ট পাঠিয়েছি। আমি এতে আগ্রহী ছিলাম কারণ আমি ভেবেছিলাম যে আমার ওয়েবসাইটে আমার যে সমস্যা হচ্ছে তা একই ছিল তবে তা নয়। চিয়ার্স।
সিড

3

ফ্রেমওয়ার্কস এবং এক্সটেনশানস প্যানেলে মোড়কের সেটিংটি "কোনও মোড়ক-ইন <body>"-এ পরিবর্তন করুন


-1

আপনার কোডে কোনও সমস্যা নেই ust ডান দিক থেকে কেবলমাত্র লোড () এক্সটেনশনটি চয়ন করুন।



-3
Select OnDomready

এইচটিএমএল:

<input id="dButton" type="button" value="test"/>

javascript:

addEventListener('load', init, false);

function init()
{
  oInput = document.getElementById('dButton');
  oInput.onclick = test;
}

function test(){
  alert("test");
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.