PDA

View Full Version : سوال: مشکل در HighLight کردن منوی css با استفاده از JQuery



Web.Designer01
پنج شنبه 21 مرداد 1389, 02:10 صبح
من با استفاده از یکی از تکنیکهای css یه منو درست کردم که با استفاده از این تکنیک طول یه عکس رو نصف کردم و گفتم وقتی کاربر موس رو آورد رو یکی از این منوها نصف پایین عکسو نشون بده و با رفتن موس نصفه بالای عکسو،فرض کنید نصفه بالای عکس به صورت معمولیه و نصفه پایین عکس به صورت highlight شدس،به این ترتیب وفتی کاربر موس رو میبره رو منو اون منو highlight میشه که جلوه زیبایی به سایت میده(دوستان اگه کدشو لازم دارن بگن تا بذارم)
من میخوام وقتی که کاربر روی یکی از این منوها کلیک کرد مثلا News و وارد صفحه News شد منوی News رو به صورت highlight شده نشون بده(یعنی همون نصفه پایین عکسو نشون بده)،طوری که کاربر با نگاه به منو متوجه شه که الان تو صفحه News هستش.
راه حل من:
من برای اینکار برای هر کدوم از منو ها (News,Music,Contact,…) یه کلاس current تعریف کردم:


/*========CurrentClassNews=========*/
#Menulia.currentNews
{
height: 57px;
width: 75px;
background: url( '../../images/MenuImages/News1.png')no-repeat;
line-height: 25px;
}


که در حقیقت این همون قسمت پایین عکسس،همون قسمت highlight شده.
بعد با استفاده از جی کوئری به صورت زیر گفتم که روی هر کدوم از این منوها که کلیک شد این کلاس رو به اون منو اضافه کنه و از قبلی حذف کنه،چون نمیدونستم قبلی کدومه بدین ترتیب گفتم که از همه قبلی ها پاک کنه تا تو یه لحظه تو تا منو با هم HighLight نباشن ، البته کدم یه خورده طولانی شد اما راه دیگه ای بلد نبودم فکر کنم با استفاده از return value بشه کدو کم کرد طوریکه مستقیم بگیم از همون منوی قبلی کلاسو حذف کنه که من اینو بلد نبودم:


<scripttype="text/javascript">
$(document).ready(function(){
$("#BiographyButton").click(function(){
$(this).addClass('currentBiography');
$("#NewsButton").removeClass('currentNews');
$("#MusicButton").removeClass('currentMusic');
.
.
.
})
$("#MusicButton").click(function(){
$(this).addClass('currentMusic');
$("#NewsButton").removeClass('currentNews');
$("#BiographyButton").removeClass('currentBiography');

})
.
.
.
})
.
.
.


در هر حال من این کدو استفاده کردم و جواب گرفتم البته در هنگامیکه از مسترپیج استفاده نکرده بودم.
حالا مشکل من کجاست؟!
مشکل اینه که من از مسترپیج استفاده میکنم،و این کدای جی کوئریو تو مسترپیج زدم،و به خاطر همینم جواب نمیده!،برای یه لحظه کوچیک اون منویی که کلیک کردمو HighLight میکنه ولی بعد از اینکه مسترپیج مربوط به اون ContentForm رو لود میکنه دوباره همون منوی اولو نشون میده که خب درست هم هست در حالت ابتدایی نباید هیچ منویی HighLight باشه.دوستان به نظر شما این مشکلو چه جوری میشه حل کرد؟

mehdi.mousavi
جمعه 22 مرداد 1389, 22:13 عصر
سلام.
ببینید. وقتی شما از Master Page استفاده می کنید، ID های تولید شده توسط ASP.NET متفاوت از اون چیزی خواهد بود که شما انتظارش رو دارید. در نتیجه، اگر بطور نمونه یه Button دارید به اسم MyButton، احتمالا HTML تولید شده رو نگاه کنید چنین ID ای تولید شده براش:

Control00_ControlPlaceHolderMain_GridView_Control0 4_MyButton

در نتیجه، وقتی شما چنین کدی در jQuery می نویسید:

$('#MyButton');

دیگه Element ای با اون شناسه وجود نداره و در نتیجه Element ای انتخاب نخواهد شد.

بنابراین، دو راه دارید:

اولین روش اینه که در ASP.NET می تونید Element مورد نظر بدین شکل آدرس کنید:

$('#<%=MyButton.ClientID%>')

وقتی اینکارو میکنید، کد HTML تولید شده این خواهد بود:

$('#Control00_ControlPlaceHolderMain_GridView_Cont rol04_MyButton')

دومین روش اینه که از یک Element با ID ی مشخص استفاده کنید، و بر اساس محل قرار گرفتن MyButton شروع به پیمایش DOM Document کرده و به element مورد نظر برسید. به بیان دیگه، از ID ی مربوطه برای رسیدن به اون Element استفاده نکنید.

موفق باشید.

پاورقی: این توضیح رو دادم که بچه ها این مساله رو تکرار نکنن، چون ظاهرا این مشکل خیلی از افراد هستش. شما هم کدتون رو بر اساس توضیحات من تغییر بدید، اگر واقعا بدون وجود Master Page درست کار میکرده، با اعمال این توضیحات نیز درست کار خواهد کرد.

Web.Designer01
شنبه 23 مرداد 1389, 00:17 صبح
سلام آقای موسوی
ممنون از پاسختون،راستش من اون روش دومو که متوجه نشدم،ولی همون روش اولم که استفاده کردم جواب نداد،با توجه به توضیحات شما کد جی کوئریمو تو قسمت Head اینجوری نوشتم:


<script type ="text/javascript" >
$(document).ready(function(){
$('#<%=BiographyButton.ClientID%>').click(function(){
$(this).addClass('currentBiography');
$('#<%=NewsButton.ClientID%>').removeClass('currentNews');
$('#<%=MusicButton.ClientID%>').removeClass('currentMusic');
})
$('#<%=MusicButton.ClientID%>').click(function(){
$(this).addClass('currentMusic');
$('#<%=NewsButton.ClientID%>').removeClass('currentNews');
$('#<%=BiographyButton.ClientID%>').removeClass('currentBiography');

})
})
</script>

اما میگه:
The name 'BiographyButton' does not exist in the current context
در ضمن کد html هم اینه که تو قسمت body نوشته شده:


<div id="Menu">
<ul>
<li><a href="#" id="NewsButton" class="currentNews"></a></li>
<li><a href="#" id="BiographyButton"></a></li>
<li><a href="#" id="MusicButton"></a></li>
<li><a href="#" id="DiscoGraphyButton"></a></li>
<li><a href="#" id="MusicVideo"></a></li>
<li><a href="#" id="PhotoGallery"></a></li>
<li><a href="#" id="Contact"></a></li>
</ul>
</div>

آی دی عنصر مربوطرو تو کد html نیازی نیست تغییر بدم؟

mehdi.mousavi
پنج شنبه 28 مرداد 1389, 00:01 صبح
سلام آقای موسوی ممنون از پاسختون،راستش من اون روش دومو که متوجه نشدم،ولی همون روش اولم که استفاده کردم جواب نداد،با توجه به توضیحات شما کد جی کوئریمو تو قسمت Head اینجوری نوشتم: در ضمن کد html هم اینه که تو قسمت body نوشته شده:

<div id="Menu">
<ul>
<li><a href="#" id="NewsButton" class="currentNews"></a></li>
<li><a href="#" id="BiographyButton"></a></li>
<li><a href="#" id="MusicButton"></a></li>
<li><a href="#" id="DiscoGraphyButton"></a></li>
<li><a href="#" id="MusicVideo"></a></li>
<li><a href="#" id="PhotoGallery"></a></li>
<li><a href="#" id="Contact"></a></li>
</ul>
</div>

آی دی عنصر مربوطرو تو کد html نیازی نیست تغییر بدم؟

سلام.
کد فوق، کدی هستش که در فایل ASPX نوشته شده، یا خروجی حاصل از اجرای ASPX هستش؟ اگر این کد سمت سرور و در فایل ASPX نوشته شده، طبیعی هستش که شما نتونید Element مورد نظر رو به اون طریق آدرس کنید. چون شما runat attribute رو برای اون element ها Set نکرده اید (به server)، اونها اصلا Server Control محسوب نمیشن و بصورت آنچه که در فایل ASPX نوشته شده Render میشن. اگر فایل ASPX خودتون رو برام بفرستید، من براتون میتونم دقیق توضیح بدم که چطور مشکل رو رفع کنید.

موفق باشید.

Web.Designer01
چهارشنبه 03 شهریور 1389, 00:40 صبح
سلام.
اگر این کد سمت سرور و در فایل ASPX نوشته شده، طبیعی هستش که شما نتونید Element مورد نظر رو به اون طریق آدرس کنید. چون شما runat attribute رو برای اون element ها Set نکرده اید،اونها اصلا Server Control محسوب نمیشن و بصورت آنچه که در فایل ASPX نوشته شده Render میشن.

سلام
بله حق با شماست،ولی خب اگه runat attribute اونهارو برابر server بذارم اونا یه server control محسوب میشن و کدای css رو اونا عمل نمیکنه،اصلا دیگه اونارو نشونم نمیده!


اگر فایل ASPX خودتون رو برام بفرستید، من براتون میتونم دقیق توضیح بدم که چطور مشکل رو رفع کنید.

ممنون،واقعا لطف میکنید،من فایلمو براتون ارسال کردم،خیلی دوست دارم بدونم اینکار چجوری انجام میشه.
موفق باشید:قلب:

mehdi.mousavi
جمعه 12 شهریور 1389, 11:30 صبح
سلام.
من الان کد شما رو دیدم. ببینید. روش صحیح انجام اینکار اینه که یه Class Selector به اسم (بطور مثال) selected تعریف کنید که نشون دهنده آیتم Select شده باشه. بعدش، بطور مثال فرض کنیم این element رو داریم:

<li><a href="Music.aspx" class="music"></a></li>
<li><a href="DiscoGraphy.aspx" class="discography"></a></li>

حالا وقتی کاربر روی یکی از این Element ها Click میکنه، کافیه تا ما selected رو هم به class اون element اضافه کنیم تا بدین شکل تغییر کنه:

<li><a href="Music.aspx" class="music"></a></li>
<li><a href="DiscoGraphy.aspx" class="discography selected"></a></li>


بعد، توی CSS شما باید علاوه بر دو کلاس music و discography، کلاسهای زیر رو نیز تعریف کنید:

.music.selected {
}

و

.discography.selected {
}


و حالت Select شدن هر Element رو در Class Selector خودش بنویسید. اینطوری، همواره یک element خواهید داشت که حاوی select هستش، و حذف کردنش به سادگی نوشتن این کد میسره:

$('#Menu li a.selected').removeClass('selected');

اینطوری کد شما Uniform میشه و اگر چند تا آیتم دیگه هم به منو اضافه کنید، کدتون تغییر نخواهد کرد. در نهایت، شما باید Index المنتی رو که selected هستش رو در Cookie نگه دارید، تا وقتی کاربر به صفحه Music.aspx رفت، بدنید توی Ready Handler باید Index (فرضا) دوم رو مجددا selected کنید، بطور مثال:

$('#Menu li').eq(1).find('a').addClass('selected');

این کد یعنی به آیتم دوم از منو class selector ای به اسم selected رو اضافه کن. بدین ترتیب، شما همواره انتخاب کاربر رو سمت Client نگهداری می کنید، و میدونید کدوم آیتم رو باید روشن نگه دارید.

موفق باشید.

farnooshhp
سه شنبه 22 آذر 1390, 18:58 عصر
من اصن اینارو متوجه نمیشم :( راه ساده تری وجود نداره؟