আপনি ইতিহাসকে প্রভাবিত না করে হ্যাশ নেভিগেশন ব্যবহার করতে পারেন?


100

আমি আশঙ্কা করি এটি অসম্ভব হতে পারে তবে ব্রাউজারের ইতিহাসে প্রবেশ ছাড়াই এবং পুনরায় লোড না করে কোনও URL এর হ্যাশ মান পরিবর্তন করার কোনও উপায় আছে কি? না কি সমমান?

সুনির্দিষ্ট হিসাবে যতদূর যায়, আমি এর লাইন ধরে কিছু বেসিক হ্যাশ নেভিগেশন বিকাশ করছিলাম:

//hash nav -- works with js-tabs
var getHash = window.location.hash;
var hashPref = "tab-";
function useHash(newHash) {
    //set js-tab according to hash
    newHash = newHash.replace('#'+hashPref, '');
    $("#tabs li a[href='"+ newHash +"']").click();
}
function setHash(newHash) {
    //set hash according to js-tab
    window.location.hash = hashPref + newHash;

    //THIS IS WHERE I would like to REPLACE the location.hash
    //without a history entry

}
    // ... a lot of irrelavent tabs js and then....

    //make tabs work
    $("#tabs.js-tabs a").live("click", function() {
        var showMe = $(this).attr("href");
        $(showMe).show();
        setHash(showMe);
        return false;
    });
    //hash nav on ready .. if hash exists, execute
    if ( getHash ){
        useHash(getHash);
    }

স্পষ্টতই jQuery ব্যবহার করা। ধারণাটি হ'ল এই নির্দিষ্ট উদাহরণে 1) ব্যবহারকারীকে প্রতিটি ট্যাব পরিবর্তনের পিছনে ফিরে যাওয়া কার্যকরভাবে অযৌক্তিক রেফারেন্সগুলি পাইল করে 'পিছনের বোতামটি ভেঙে' ফেলতে পারে এবং ২) রিফ্রেশটি চাপলে তারা বর্তমানে কোন ট্যাবে রয়েছেন তা ধরে রাখতে পারে না একটি বিরক্তি


আপনি যদি ইতিহাসের ট্র্যাক রাখতে না চান তবে কেন হ্যাশ পরিবর্তন করতে চান? : |
Ionuț Staicu

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

উত্তর:


96

location.replace("#hash_value_here");যতক্ষণ না আমি খুঁজে পেয়েছি এটি আইওএস ক্রোমে কাজ করে না ততক্ষণ আমার পক্ষে ভাল কাজ করেছে। কোন ক্ষেত্রে, ব্যবহার করুন:

history.replaceState(undefined, undefined, "#hash_value")

history.replaceState () ঠিক replaceState ব্যতীত history.pushState () (যেমন পরিচালনা) এর পরিবর্তে একটি নতুন একটি তৈরি করার বর্তমান ইতিহাস এন্ট্রি পরিবর্তন।

মনে রাখবেন #url এর শেষ অংশটি পরিবর্তন করা হবে।


4
পুরোপুরি আধুনিক ব্রাউজারগুলিতে যাওয়ার উপায়; আংশিক সমর্থন সেশন ইতিহাস পরিচালনার বিষয়ে সচেতন থাকুন ।
ম্যাট

এটি কীভাবে ব্যবহার করতে হয় তা নিয়ে আমি বিভ্রান্ত। আমার এখনও কি window.location.hash = 'my-hash';অনুসরণ করা উচিত history.replaceState(undefined, undefined, "#my-hash")?
ব্রাম ভ্যানরোয়

4
@ ব্রামভানরোয় না, পরেরটি ব্যবহার করা যথেষ্ট।
লুসিয়া

4
আপনি যদি না ব্যবহার করেন: লক্ষ্য নির্বাচক ... তবে ইতিহাসের ফাংশনগুলি অকেজো, কারণ অনুমানের সেই অংশটি (ইতিহাস অপিসের সাথে সিএসএস মিথস্ক্রিয়া) বর্তমানে সংজ্ঞায়িত হয়নি বলে মনে হয় এবং বেশিরভাগ / সমস্ত ব্রাউজারের দ্বারা প্রতিস্থাপনের ইতিহাসে স্টাইলটি পুনরায় সংশোধিত হয় না।
মরফলস

4
দ্রষ্টব্য: আকর্ষণীয়ভাবে, history.replaceState(...)কোনও ইভেন্ট ট্রিগার করে নাwindow.onhashchangelocation.replaceকরে অদ্ভুত, তাই না?
ম্যাট

101
location.replace("#hash_value_here"); 

উপরেরগুলি মনে হয় আপনি পরে যা করছেন।


4
এই হল. এবং আপনার যদি ইউরি বিভাগ রয়েছে, অবস্থান.replice (উইন্ডো.লোকেশন + "# হ্যাশ") সেগুলি সংরক্ষণ করবে।
টেডাররা

7
এই পদ্ধতিটি দ্বিতীয়ত, অনেক ক্লিনার, আশা করি এটি সঠিক উত্তর হিসাবে চিহ্নিত হয়েছে।
জোয়েলিস

14
window.location.replace(('' + window.location).split('#')[0] + '#' + hash);মাত্র হ্যাশটি আপডেট করতে
12 'তে জনস্টর্ম

4
আমি এটি উইন্ডোজ 8 এর অধীনে ক্রোম 30 এ পরীক্ষা করছি, যদি আমি ক্রোম ইতিহাসে যাই এবং আমার পরীক্ষার url এর অধীনে "এই সাইট থেকে আরও" নির্বাচন করি তবে আমি এই পদ্ধতিতে যুক্ত হওয়া সমস্ত হ্যাশ দেখতে পাচ্ছি।
অ্যালেক্স ভ্যাং

4
সাবধান থাকুন যে অবস্থান.রেপ্লেস ('# হ্যাশ_ভ্যালু_এই') কেবল হ্যাশ টুকরা পরিবর্তন করে এবং পাথটি নয়, সুতরাং এটি কোনও পৃষ্ঠা লোড ট্রিগার করে না .... ডকুমেন্টটিতে একটি বেস ট্যাগ থাকা ব্যতীত: <base href ="http://example.com/" /> যদি এটিতে একটি বেস ট্যাগ থাকে: , তারপরে আপনি যখন কেবল একটি শীর্ষস্থানীয় দিয়ে প্রতিস্থাপন পদ্ধতিটি ব্যবহার করবেন তখন "#hash_value_here"এটি বাস্তবে এমন হবে যেমন আপনি said লোকেশন.রেপ্লেস (' উদাহরণ . com/#hash_value_ এখানে' ) বলেছিলেন । আপনি যখন এটি এখানে পড়বেন তখন এটি সুস্পষ্ট বলে মনে হচ্ছে, তবে আপনি যখন কোনও পাথ খণ্ডিত পৃষ্ঠাতে রয়েছেন এবং বেসটি সেট করা আছে তা বুঝতে পারেন না got
টাইলার ক্যাসটেন

6

সম্পাদনা করুন: এখন কয়েক বছর হয়েছে, এবং ব্রাউজারগুলি বিকশিত হয়েছে।

@ লাক্সিয়ালুর উত্তর হ'ল উপায়

- পুরানো উত্তর -

আমিও মনে করি এটি অসম্ভব (এই সময়ে)। আপনি যদি হ্যাশ মানটি ব্যবহার না করে থাকেন তবে আপনার কেন পরিবর্তন করতে হবে?

আমি বিশ্বাস করি যে কেন আমরা হ্যাশ মানটি প্রোগ্রামার হিসাবে ব্যবহার করি তার প্রধান কারণ হ'ল ব্যবহারকারীকে আমাদের পৃষ্ঠাগুলি বুকমার্ক করতে দেওয়া বা ব্রাউজারের ইতিহাসে একটি রাষ্ট্র সংরক্ষণ করা। আপনি যদি এটির কিছু করতে না চান তবে কেবল একটি পরিবর্তনশীল অবস্থায় রাষ্ট্রটি সংরক্ষণ করুন এবং সেখান থেকে কাজ করুন।

আমি মনে করি যে হ্যাশ ব্যবহারের কারণটি এমন একটি মান নিয়ে কাজ করা যা আমাদের নিয়ন্ত্রণের বাইরে থাকে। যদি আপনার এটির প্রয়োজন না হয় তবে এর অর্থ সম্ভবত আপনার নিজের নিয়ন্ত্রণে থাকা সমস্ত কিছু রয়েছে, তাই কেবলমাত্র রাজ্যটিকে একটি পরিবর্তনশীল হিসাবে সংরক্ষণ করুন এবং এটি দিয়ে কাজ করুন। (আমি নিজেকে পুনরাবৃত্তি করতে পছন্দ করি)

আমি মনে করি এটা আপনার কাজে লাগবে. আপনার সমস্যার আরও সহজ সমাধান হতে পারে।

আপডেট: এটি সম্পর্কে:

  1. একটি প্রথম হ্যাশ সেটআপ করুন এবং তা ব্রাউজারের ইতিহাসে সংরক্ষিত হয়েছে তা নিশ্চিত করুন।
  2. যখন কোনও নতুন ট্যাব নির্বাচিত হয়ে যায়, তা window.history.back(1)করুন যা ইতিহাসটিকে আপনার প্রথম থিম হ্যাশ থেকে ফিরিয়ে আনবে।
  3. এখন আপনি নতুন হ্যাশ সেট করেছেন, অতএব ট্যাবিং ইতিহাসে কেবল একটি প্রবেশ করবে।

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


এটি খুব সম্ভব যে আমি অনুপস্থিত কিছু আছে (ক্লান্তি একটি দুর্দান্ত অজুহাত, আমি তার সাথে যাব) তবে আপনি কি বলছেন যে আমি এমন একটি পরিবর্তনশীল সেট করতে পারি যা পুনরায় লোডের পরিবর্তিত মান ধরে রাখতে পারে? কুকি ছাড়াও? (কুকিজগুলি একরকম মনে হয়, কোনওভাবে ..) সম্ভবত এটিই পরিষ্কার ছিল না। আমি হ্যাশ মানটি ব্যবহার করব - বিশেষ করে পুনরায় লোড করার জন্য। সাড়া দেওয়ার জন্য ধন্যবাদ!

আমার স্পষ্টতা স্পষ্ট করার জন্য: যদি ব্যবহারকারী পুনরায় লোডটি হিট করে। হ্যাশের জন্য এটিই। আমি এখনও তাদের সাধারণ ব্যবহারে পুনরায় লোড এড়াতে চেষ্টা করছি (ট্যাবগুলি পরিবর্তন / ক্লিক করা)।

ঠিক আছে, তাই আপনি পুনরায় লোড করার পরে তথ্যের জন্য কিছু মান ব্যবহার করবেন। দুর্ভাগ্যক্রমে, হ্যাশ মানটি কিছু ব্রাউজারের ইতিহাসের দ্বারা নেওয়া হবে। এটি বলার জন্য দুঃখিত, তবে আমার এক্সপ্রেস থেকে কুকিগুলি আপনার সেরা বাজি। আপনি যদি এমন কিছু চান যা ব্রাউজারের ইতিহাস সনাক্ত না করে তবে পুনরায় লোডের পরে ধরে রাখতে, দুর্ভাগ্যক্রমে, কুকিজ। যদি ব্যবহারকারী কোনও লিঙ্কে ক্লিক করে থাকেন তবে আপনি লিঙ্কটি ক্যোয়ারী ( ?mystate=greatness) হিসাবে সেটআপ করতে পারেন , যদিও এটি এজাক্স হওয়ার দরকার নেই, আপনি জাভাস্ক্রিপ্টের জন্য অনুরোধ শুরু করার সময় পড়ার জন্য তথ্য সংরক্ষণ করতে পারেন।
guzart

হ্যাঁ, হ্যাশটি পুনরায় লোড দেওয়ার পরে ব্যবহারকারীর তথ্য সংরক্ষণ করার জন্য, তবে আপনার সমস্যাটি হ'ল কিছু ব্রাউজার ইতিহাসের সেই পরিবর্তনগুলি সংরক্ষণ করবে, এটি তাদের কাজ করার উপায় ... :(
গুজার্ট

হ্যাঁ, আপনি ঠিক বলেছেন। আহ ভালো. (অন্য কোনও পদ্ধতি বা কোনও কিছু দ্বারা ভুল প্রমাণিত হতে চাই))

-1

হাইপারলিংকের ক্লিক কলগুলি ধরার জন্য আপনি সর্বদা ইভেন্ট শ্রোতা তৈরি করতে পারেন এবং কলব্যাক ফাংশনে e.preventDefault () রাখুন, এটি ব্রাউজারটিকে ইতিহাসে fromোকানো থেকে বিরত রাখতে পারে।

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