এইচটিএমএল / জাভাস্ক্রিপ্ট: এসসিআর সেট সহ স্ক্রিপ্ট ট্যাগে লোড জেএসএন ডেটা কীভাবে অ্যাক্সেস করবেন


90

পৃষ্ঠাটি দৃশ্যমান হওয়ায় আমি ক্লায়েন্টটিতে অ্যাক্সেসযোগ্য করতে চাইলে আমি এই জেএসএন ফাইলটি সার্ভারে উত্পন্ন করি। মূলত আমি যা অর্জন করতে চাই তা হ'ল:

আমার এইচটিএমএল ডকুমেন্টে আমার নীচের ট্যাগটি ঘোষিত হয়েছে:

<script id="test" type="application/json" src="http://myresources/stuf.json">

এর উত্সে উল্লিখিত ফাইলটির জেএসওএন ডেটা রয়েছে। আমি যেমন দেখেছি, স্ক্রিপ্টগুলির সাথে ঘটেছিল ঠিক তেমনই ডেটাও ডাউনলোড করা হয়েছে।

এখন, আমি এটি জাভাস্ক্রিপ্টে কীভাবে অ্যাক্সেস করব? আমার JSON ডেটা পাওয়ার চেষ্টা করার জন্য প্রচুর পদ্ধতি ব্যবহার করে, jQuery সহ এবং ছাড়াও আমি স্ক্রিপ্ট ট্যাগটি অ্যাক্সেস করার চেষ্টা করেছি, তবে কোনওভাবে এটি কাজ করে না। হচ্ছে তার innerHTMLকাজ করে JSON তথ্য লিপিতে ইনলাইন লিখিত হয়েছে। যা এটি ছিল না এবং তা আমি অর্জন করার চেষ্টা করছি না।

পৃষ্ঠা লোডের পরে রিমোট জেএসএন অনুরোধও কোনও বিকল্প নয়, যদি আপনি এটি প্রস্তাব করতে চান তবে।


4
কোনও জসন ফাইলের পরিবর্তে, এটি একটি জাভাস্ক্রিপ্ট ফাইল করুন যা বস্তুকে ভেরিয়েবলের জন্য বরাদ্দ করে। অন্য পদ্ধতির এজ্যাক্স ব্যবহার করা হয়।
আসাদ সাইদুদ্দিন

4
প্রথম পরামর্শটি হ'ল বর্তমান বাস্তবায়ন। আমি এটি না করতে চাই কারণ আমি কাঠামো সরবরাহ করতে আচরণ ব্যবহার করছি। আমি স্ট্রাকচারের জন্য স্ট্রাকচার ব্যবহার করতে পছন্দ করব (যদি আমি জেএসএন চাই, আমি জেএসওএন পাব)। দ্বিতীয় পরামর্শটি চাওয়া হয়নি (সূচনা প্রক্রিয়াটির জন্য আমার এই ডেটা দরকার)।
চক

4
@ একটি <script>ট্যাগের মাধ্যমে বা এজেএক্সের মাধ্যমে নির্বাচন করুন আপনার এখনও একটি অতিরিক্ত এইচটিটিপি অনুরোধ সম্পূর্ণ হওয়ার জন্য অপেক্ষা করতে হবে। ব্রাউজারটি আপনাকে স্ক্রিপ্টের বিষয়বস্তু পড়তে দিবে না যদি আপনি এটিকে "src" বৈশিষ্ট্যযুক্ত করে তোলেন, সুতরাং আপনার একমাত্র বিকল্পটি AJAX অনুরোধ করা।
পয়েন্টি

4
ডাউনলোড করার সাথে সাথে একটি <script> ট্যাগ স্টাফের মাধ্যমে @ পন্টি মূল্যায়ন করা হবে। যদি আমি আমার জেসন স্ক্রিপ্টটি আমার জেএস স্ক্রিপ্টের আগে রাখি তবে জেএসপি স্ক্রিপ্ট ডেটা জেএস স্ক্রিপ্ট ডেটার আগে মূল্যায়ন হবে, এর অর্থ, আমি অপেক্ষা করতে যাচ্ছি না, ডেটা ইতিমধ্যে রয়েছে। এটি আমার একমাত্র বিকল্প হিসাবে, আমি আপনার সাথে একমত হওয়ার আগে কিছু অফিসিয়াল ডকুমেন্টেশন দেখতে চাই (আপনি ভুল বলছেন না, ঠিক এই কারণেই আমি প্রশ্নটি লিখেছিলাম)।
চক

4
"পৃষ্ঠা লোডের পরে রিমোট জেএসএন অনুরোধও কোনও বিকল্প নয়, যদি আপনি এটি প্রস্তাব করতে চান তবে"। ... কীভাবে কোনও জেএসএন অনুরোধ প্রেরিত অনুরোধের চেয়ে আলাদা <script src=""></script>? তারা উভয়ই আপনার সার্ভারের বিরুদ্ধে জিইটি কল করছে।
বেন লেশ

উত্তর:


114

আপনি JSON এর মতো লোড করতে পারবেন না, দুঃখিত।

আমি জানি আপনি ভাবছেন "আমি srcএখানে কেন ব্যবহার করতে পারি না ? আমি এই জাতীয় জিনিস দেখেছি ...":

<script id="myJson" type="application/json">
 { 
   name: 'Foo' 
 }
</script>

<script type="text/javascript">
    $(function() {
        var x = JSON.parse($('#myJson').html());
        alert(x.name); //Foo
     });
</script>

... এটি সহজভাবে বলতে গেলে, এটি ছিল কেবলমাত্র স্ক্রিপ্ট ট্যাগটিকে ডেটা হোল্ডার হিসাবে "আপত্তিজনক" করা হয়েছিল। আপনি সব ধরণের ডেটা দিয়ে এটি করতে পারেন। উদাহরণস্বরূপ, টেম্পলেটগুলি ধরে রাখার জন্য প্রচুর টেম্প্লেটিং ইঞ্জিনগুলি লিভারেজ স্ক্রিপ্ট ট্যাগগুলি দেয়

রিমোট ফাইল থেকে আপনার জেএসএন লোড করার জন্য বিকল্পগুলির একটি সংক্ষিপ্ত তালিকা রয়েছে:

  1. ব্যবহার করুন $.get('your.json')বা এই জাতীয় কিছু অন্যান্য এজেএক্স পদ্ধতি।
  2. এমন একটি ফাইল লিখুন যা আপনার জসনের একটি বৈশ্বিক পরিবর্তনশীল সেট করে। (মনে হচ্ছে হকি)
  3. এটি একটি অদৃশ্য আইফ্রেমে টানুন, তারপরে এটি লোড হওয়ার পরে এর সামগ্রীগুলি স্ক্র্যাপ করুন (আমি এই "1997 মোড" বলি)
  4. একটি ভুডু পুরোহিতের সাথে পরামর্শ করুন।

চূড়ান্ত পয়েন্ট:

পৃষ্ঠা লোডের পরে রিমোট জেএসএন অনুরোধও কোনও বিকল্প নয়, যদি আপনি এটি প্রস্তাব করতে চান তবে।

... এটা বোঝা যায় না। আপনার প্রক্রিয়াকরণের সময় একটি এজেএক্স অনুরোধ এবং ব্রাউজার দ্বারা প্রেরিত একটি অনুরোধের মধ্যে পার্থক্যটি <script src="">মূলত কিছুই নয়। তারা দু'জনই রিসোর্সে জিইটি করবে। কোনও স্ক্রিপ্ট ট্যাগ বা একটি এজেএক্স কলের কারণে এটি করা হয়েছে কিনা এইচটিটিপি যত্ন করে না এবং আপনার সার্ভারটিও করবে না।


4
দুর্দান্ত উত্তর। যখন আপনি "স্ক্রিপ্ট ট্যাগটিকে 'আপত্তিজনক' করা হচ্ছে বলছেন তখন আপনি বোঝাচ্ছেন যে এটি একটি ভুল (সম্ভবত ভুল নয়, তবে" সৃজনশীল ") স্ক্রিপ্ট ট্যাগটির ব্যবহার? আপনার এন। 2 বিকল্পটি হ'ল আমাদের ইতিমধ্যে উত্পাদনে রয়েছে, আমি খাঁটি পরীক্ষার বাইরে কঠোরভাবে জেসন / নো-জেএস সমাধানের সন্ধান করছিলাম (আমি নিশ্চিত যে এটি নিশ্চিত হলে এটি সম্ভব হচ্ছে না)। চূড়ান্ত বিষয়টি সম্পর্কে, অনলোডের ইভেন্টের আগে আমার এই তথ্যটি দরকার এবং আমি পুরো সূচনাটি কোনও অ্যাসিনক্রোনাস অনুরোধের উপর নির্ভর করতে চাই না যা সমাপ্তির সময় বিভিন্ন হতে পারে। এটি আজাক্স কল এবং স্ক্রিপ্ট ট্যাগের মধ্যে মূল পার্থক্য।
চক

4
না, আমি মনে করি এটি "ভুল" নয়, প্রতি কথায়, কেবল ... "সৃজনশীল" এটি সম্ভবত একটি ভাল শব্দ। আসলে যদি <script>ট্যাগটিতে জেএসওএন লেখা সম্ভব হয় তবে আমি সেই পথে যাব, আমার ধারণা।
বেন লেশ

হ্যাঁ, পুরো চ্যালেঞ্জটি স্ক্রিপ্ট ট্যাগ এসসিআর অ্যাট্রিবিউট ব্যবহার করে এটি লোড করছিল এবং নথিতে এই তথ্যটিকে "আবদ্ধ" করবে।
ChuckE

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

4
@ জয়দিপসিংহ, তারপরে আপনাকে আপনার সিওআরএস সমস্যাগুলি সমাধান করতে হবে এবং এজ্যাক্স ব্যবহার করতে হবে। ব্রাউজাররা এই ধরণের আচরণকে অস্বীকার করার একটি কারণ রয়েছে। বেশিরভাগ ব্রাউজারগুলি আপনাকে আর কোনও আইফ্রেমে সিওআরএসের চারপাশে হ্যাক করতে দেয় না।
বেন লেশ

14

আর একটি সমাধান হ'ল সার্ভার-সাইড স্ক্রিপ্টিং ভাষার ব্যবহার করা এবং জেসন-ডেটা ইনলাইন কেবল অন্তর্ভুক্ত করা। এখানে একটি উদাহরণ যা পিএইচপি ব্যবহার করে:

<script id="data" type="application/json"><?php include('stuff.json'); ?></script>
<script>
var jsonData = JSON.parse(document.getElementById('data').textContent)
</script>

উপরের উদাহরণটি প্রকার সহ একটি অতিরিক্ত স্ক্রিপ্ট ট্যাগ ব্যবহার করে application/json। একটি এমনকি সহজ সমাধানটি সরাসরি জাভাস্ক্রিপ্টে জেএসএনকে অন্তর্ভুক্ত করা:

<script>var jsonData = <?php include('stuff.json');?>;</script>

অতিরিক্ত ট্যাগ সহ সমাধানটির সুবিধা হ'ল জাভাস্ক্রিপ্ট কোড এবং জেএসএন ডেটা একে অপরের থেকে পৃথক রাখা হয়েছে।


পাঠ্য সামগ্রীর জন্য। .html স্ক্রিপ্ট ট্যাগটিতে আমার জন্য কাজ করে না
শেঠ ম্যাকক্লেইন

9

এটি প্রদর্শিত হবে এটি সম্ভব নয়, বা কমপক্ষে সমর্থিত নয়।

থেকে HTML5 এর স্পেসিফিকেশন :

যখন ডেটা ব্লক (স্ক্রিপ্টগুলির বিপরীতে) অন্তর্ভুক্ত করার জন্য ব্যবহৃত হয় , তখন ডেটা অবশ্যই ইনলাইন এম্বেড করা আবশ্যক, প্রকারের বৈশিষ্ট্যটি ব্যবহার করে ডেটা ফর্ম্যাট অবশ্যই দিতে হবে, এসসিআর বৈশিষ্ট্য নির্দিষ্ট করা আবশ্যক নয় এবং স্ক্রিপ্ট উপাদানটির বিষয়বস্তু অবশ্যই মেনে চলতে হবে ব্যবহৃত বিন্যাস জন্য সংজ্ঞায়িত প্রয়োজনীয়তা।


4
জেএস এবং সিএসএসের চেয়ে সংবেদনশীল হিসাবে ডেটা হ্যান্ডেল করার নীতি বলে মনে হচ্ছে।

5

যদিও এটি scriptট্যাগ দিয়ে বর্তমানে সম্ভব নয় , iframeযদি এটি একই ডোমেন থেকে আসে তবে এটির মাধ্যমে এটি সম্ভব ।

<iframe
id="mySpecialId"
src="/my/link/to/some.json"
onload="(()=>{if(!window.jsonData){window.jsonData={}}try{window.jsonData[this.id]=JSON.parse(this.contentWindow.document.body.textContent.trim())}catch(e){console.warn(e)}this.remove();})();"
onerror="((err)=>console.warn(err))();"
style="display: none;"
></iframe>

উপরেরটি ব্যবহার করতে, কেবল আপনার যা প্রয়োজন তার সাথে প্রতিস্থাপন করুন idএবং srcগুণাবলীটি। id(যা আমরা এই অবস্থায় অনুমান করব সমান mySpecialIdসংরক্ষণ করা হবে না) তথ্য মধ্যে window.jsonData["mySpecialId"]

অন্য কথায়, প্রতিটি আইফ্রেমের জন্য idযা onloadস্ক্রিপ্টটি ব্যবহার করে এবং ব্যবহার করে সেগুলিতে নির্দিষ্ট ডেটার মধ্যে সিঙ্ক্রোনজ করে সেই ডেটাটি সিঙ্ক্রোনসিভ করে window.jsonDataবস্তুটিতে লোড করা idহবে।

আমি মজা করার জন্য এবং যে এটি "সম্ভব 'কিন্তু আমি দেখানোর জন্য এটা করেছে না সুপারিশ করছি যে এটি ব্যবহৃত হবে।


এখানে এমন একটি বিকল্প রয়েছে যা পরিবর্তে কলব্যাক ব্যবহার করে।

<script>
    function someCallback(data){
        /** do something with data */
        console.log(data);

    }
    function jsonOnLoad(callback){
        const raw = this.contentWindow.document.body.textContent.trim();
        try {
          const data = JSON.parse(raw);
          /** do something with data */
          callback(data);
        }catch(e){
          console.warn(e.message);
        }
        this.remove();
    }
</script>
<!-- I frame with src pointing to json file on server, onload we apply "this" to have the iframe context, display none as we don't want to show the iframe -->
<iframe src="your/link/to/some.json" onload="jsonOnLoad.apply(this, someCallback)" style="display: none;"></iframe>

ক্রোমে পরীক্ষিত এবং ফায়ারফক্সে কাজ করা উচিত। আইই বা সাফারি সম্পর্কে অনিশ্চিত।


3

আমি বেনের সাথে একমত আপনি সাধারণ JSON ফাইল লোড / আমদানি করতে পারবেন না।

তবে আপনি যদি একেবারে এটি করতে চান এবং json ফাইল আপডেট করার নমনীয়তা পান তবে আপনি এটি করতে পারেন

আমার- json.js

   var myJSON = {
      id: "12ws",
      name: "smith"
    }

index.html

<head>
  <script src="my-json.js"></script>
</head>
<body onload="document.getElementById('json-holder').innerHTML = JSON.stringify(myJSON);">
  <div id="json-holder"></div>
</body>

2

এই উত্তরটি দেখুন: https://stackoverflow.com/a/7346598/1764509

$.getJSON("test.json", function(json) {
    console.log(json); // this will show the info it in firebug console
});

4
get .getJSON () একটি এজ্যাক্স কল।
টবি জি

আমি কীভাবে কনসোলের পরিবর্তে লিঙ্কযুক্ত এইচটিএমএল ফাইলটিতে তথ্যটি প্রদর্শন করতে পারি?
টি.ডো

2

আপনার যদি অন্য ডোমেইন থেকে জেএসএন লোড করতে হয়: http://en.wikedia.org/wiki/JSONP
তবে এক্সএসএসআই এর সম্ভাব্য আক্রমণ সম্পর্কে সচেতন হন: https://www.scip.ch/en/?labs.20160414

যদি এটি একই ডোমেন তাই কেবল অ্যাজাক্স ব্যবহার করুন।


4
JSONP JSON- ফর্ম্যাট ফলাফল সহ কাজ করে না। এছাড়াও, কোনও স্ক্রিপ্টে আর্গুমেন্ট হিসাবে পাস করা জেএসএনপি প্যারামিটারগুলি সার্ভার দ্বারা সংজ্ঞায়িত করা হয়েছে ... এতে আপনার অ্যাক্সেস নাও থাকতে পারে।
ই-

1

আপনার স্ক্রিপ্ট ফাইলে এই জাতীয় কিছু রাখুন json-content.js

var mainjson = { your json data}

তারপরে স্ক্রিপ্ট ট্যাগ থেকে কল করুন

<script src="json-content.js"></script>

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

<script>
console.log(mainjson)
</script>

0

জাভাস্ক্রিপ্টের মধ্যে হ'ল জসনটি ব্যবহারের জন্য অন্য একটি বিকল্প। এটি জাভাস্ক্রিপ্ট অবজেক্ট নোটেশন হিসাবে আপনি ঠিক আপনার জাস্টস নোটেশন দিয়ে সরাসরি সরাসরি অবজেক্ট তৈরি করতে পারেন। আপনি যদি এটি একটি .js ফাইলে সংরক্ষণ করেন তবে আপনি নিজের অ্যাপ্লিকেশনটিতে অবজেক্টটি ব্যবহার করতে পারেন। এটি আমার জন্য একটি দরকারী বিকল্প ছিল যখন আমার কিছু স্থির জসন ডেটা ছিল যা আমি আমার অ্যাপ্লিকেশনটির বাকী অংশ থেকে আলাদা করে একটি ফাইলে ক্যাশে রাখতে চেয়েছিলাম।

    //Just hard code json directly within JS
    //here I create an object CLC that represents the json!
    $scope.CLC = {
        "ContentLayouts": [
            {
                "ContentLayoutID": 1,
                "ContentLayoutTitle": "Right",
                "ContentLayoutImageUrl": "/Wasabi/Common/gfx/layout/right.png",
                "ContentLayoutIndex": 0,
                "IsDefault": true
            },
            {
                "ContentLayoutID": 2,
                "ContentLayoutTitle": "Bottom",
                "ContentLayoutImageUrl": "/Wasabi/Common/gfx/layout/bottom.png",
                "ContentLayoutIndex": 1,
                "IsDefault": false
            },
            {
                "ContentLayoutID": 3,
                "ContentLayoutTitle": "Top",
                "ContentLayoutImageUrl": "/Wasabi/Common/gfx/layout/top.png",
                "ContentLayoutIndex": 2,
                "IsDefault": false
            }
        ]
    };
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.