مشکل کار نکردن position : fixed در اینترنت اکسپلورر

۵ فروردین ۱۳۹۱ بدون دیدگاه

برای اینکه بتونید به یک المنت در css موقعیت فیکس رو بدید باید حتماً docType مربوط به سند html رو که المنت مورد نظر درش قرار داره تنظیم کنید . من مقدار زیر رو اضافه کردم و حالا می تونم از position : fixed در اینترنت اکسپلورر استفاده کنم .

 


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

اینرو به بالای سند قبل از تگ آغازین html اضافه کنید .

دسته هااشتراک گذاری, سی اس اس برچسب ها:, , ,

خارج کردن یک المنت از بین آیتم های انتخاب شده توسط jquery

۱۴ اسفند ۱۳۹۰ بدون دیدگاه

همه با استفاده از Selector ها در jquery  آشنا هستیم و خیلی زیاد از اون ها برای انجام یک عملیات استفاده می کنیم . حالا اگر بخوایم تمام المنت هایی رو که در قالب یک Selector توسط jquery انتخاب کنیم ولی یک یا چند المنت رو از این دسته خارج کنیم چکار باید کرد ؟ مثلا تمام تصاویر به جز بنر یا تمام لینک ها به جز لینک هایی که متعلق به یک کلاس مشخص هستند .

jquery تابعی داره به اسم not() که همین کار رو انجام میده یعنی المنتهایی رو از مجموعه المنتهای انتخاب شده خارج می کنه .پارامترش هم یک selector هستش .یعنی id , class , tag و … .

 

مثلاً به تمام تصاویر به جز بنر یک کلاس اضافه کنیم :


$("img"(.not("#Banner").addClass("images");

 

 

دسته هااشتراک گذاری, جی کوئری برچسب ها:,

حذف فواصل خالی دو طرف یک رشته در ms sql

۱۳ اسفند ۱۳۹۰ بدون دیدگاه

توابع trim() از توابع کاربردی بخصوص در فرم های دریافت اطلاعات از کاربر هستند . در sql server هم به این مسئله  توجه شده و ۲ تابع RTrim و Ltrim به ترتیب برای حذف فواصل اضافی سمت راست و چپ رشته ها وجود دارند . اما متأسفانه تابعی برای حذف فواصل هر دو طرف در sql server وجود نداره و باید با ترکیبی از دو تابع بالا اینکار رو انجام داد . خوب می تونیم در قالب یک UDF ( user defined function) این عملیات رو ذخیره کرده و هرجا لازم شد از اون استفاده کنیم . کدش به صورت زیره :


CREATE FUNCTION dbo.TRIM(@string VARCHAR(MAX))
 RETURNS VARCHAR(MAX)
 BEGIN
 RETURN LTRIM(RTRIM(@string))
 END
 GO
دسته هاsql server, اشتراک گذاری برچسب ها:, ,

۱۳/۱۲/۲۰۱۱ ۱۷:۰۳ یا لحظاتی پیش ، کدام قابل درک تر است ؟

۲۲ آذر ۱۳۹۰ ۲ دیدگاه

بحث کاربرپسند بودن طراحی ها ذهن ها رو به سمت گرافیک وب سایت و یا اپلیکشن سوق می ده اما کاربرپسند بودن تنها در گرافیک خلاصه نمیشه . نحوه ارائه اطلاعات هم بخشی از این داستانه . روش های مختلفی برای بیان یک مطلب وجود داره و مسئله ای که تعیین کننده برتری یک روش است سرعت آن در تفهیم منظور به گیرنده است . هممون می دونیم که یک تصویر جای هزاران کلمه رو می تونه پر کنه .

امروز به وب سایتی برخوردم که تاریخ انتشار کامنت کاربران رو به جای اینکه در قالب ۱۳/۱۲/۲۰۱۱ ۱۷:۰۳ نشون بده از اصطلاحات روزمره ای که بکار می بریم استفاده کرده بود مثل “چند لحظه پیش” یا “یک ساعت پیش” و… . به نظرم جالب اومد . کاربران با دیدن این تاریخ ها خیلی سریع متوجه زمان انتشار کامنت می شن در مقایسه با قالب همیشگی تاریخ یا حداقل کاربران تنبل مثل من  . این می تونه مثالی از یک طراحی رابط کاربرپسند باشه .

من هم تصمیم گرفتم برای خودم همچین کدی رو بنویسم و استفاده کنم . کار سختی نیست . یک سری شرط بصورت if و switch و نه بیشتر . سورس و dll رو برای استفاده کسانی که دوست دارن اینجوری تاریخ رو نشون بدن برای دانلود گذاشتم . البته این کلاس طوری است که در صورتی که تفاوت زمانی کمتر از ۳۰ روز باشه به صورت اصطلاحی نشون می ده و بیشتر از اون رو خود تاریخ ارسال شده رو به صورت رشته برمیگردونه .

+ سورس و dll

اگر سورس رو دستکاری کنید که هیچ اما اگر از dll استفاده کردید روش استفاده به صورت ذیل ! می باشد :

- اضافه کردن dll به پوشه bin پروژه ( از طریق کپی و پیست یا دادن رفرنس )

- در صفحه ای که می خواید از این کلاس استفاده کنید فضانام Royasaz.OpenSource رو اضافه کنید .

- کلاسی به نام FriendlyDate در اون صفحه در دسترس قرار می گیره . این کلاس تنها یک تابع به نام Convert داره که یک تاریخ میلادی در قالب DateTime رو می گیره و اصطلاح متناسب رو در قالب رشته برمی گردونه . ایراد کار همینجاست که اگه تاریخ تون در قالب شمسی است اول باید اونرو به میلادی تبدیل کنید و بعد به تابع بفرستید .


using Royasaz.OpenSource;

DateTime DateInPast=new DateTime(2011,12,12,12,12);

Response.Write(FriendlyDate.Convert(DateInPast));

نیاز به گفتن هم نیست که این کلاس کامل نیست و جای کار زیاد داره .

چرا UpdatePanel خطرناک است ؟

۱۸ آذر ۱۳۹۰ بدون دیدگاه

همه ما که با ASP.NET کار می کنیم از سادگی بهره بردن از قابلیت های AJAX با استفاده از کنترل UpdatePanel لذت می بریم . و بعضی مواقع نمی تونیم از وسوسه استفاده از چندین و چند UpdatePanel در یک صفحه مقاومت کنیم . اما متأسفانه شفاف نبودن آنچه در تبادلات بین سرور و کلاینت روی می دهد می تواند باعث بوجود آمدن مشکل برای سایت شود .

بهتر است با یک مثال جلو برویم که همه با آن آشنا هستیم :

<asp:ScriptManager ID="ScriptManager1" runat="server" />
<asp:UpdatePanel runat="server" ID="up1">
 <ContentTemplate>
   <asp:Label runat="server" ID="Label1" Text="Update Me!" /><br />
   <asp:Button runat="server" ID="Button1"
     Text="Postback Update" OnClick="Button1_Click" />
 </ContentTemplate>
</asp:UpdatePanel>

و

 

 

protected void Button1_Click(object sender, EventArgs e)
{
  Label1.Text = DateTime.Now.ToLongDateString();
}

به همین سادگی . یک کلید فشرده می شود . یک درخواست غیرهمزمان برای زمان و تاریخ جاری ارسال می شود و نتیجه در یک Label نشان داده می شود . حال نگاهی به پشت صحنه می اندازیم و HTTP Post و  Response مربوط به این عملیات را بررسی می کنیم .

 

 

 

شوکه کننده است . نه ؟ برای نمایش یک رشته ۲۲ کاراکتری ، این حجم از تبادل داده بسیار زیاد است . شاید برای استفاده معدود و سبک قابل قبول باشد اما در وب سایت های با عملیات های سنگین و بار زیاد باعث دردسر خواهد شد .

خوشبختانه microsoft یک ابزار دیگر رو برای انجام اینگونه عملیات ها در چارچوب فریمورک AJAX.Net در اختیار ما قرار داده ، Page Methods.

Page Method ها این اجازه رو به صفحات AJAX می دن تا مستقیماً توابع static یک صفحه رو با استفاده از JSON اجرا کنن . بجای انجام یک postBack و سپس دریافت کدهای جدید HTML برای جایگزینی کامل محتویات یک UpdatePanel ، می تونیم با استفاده از Page Method فقط همون اطلاعاتی رو که موردنیازمون هست درخواست و دریافت کنیم .

 

<asp:ScriptManager ID="ScriptManager1" runat="server"
  EnablePageMethods="true" />
<script language="javascript">
 function UpdateTime() {
   PageMethods.GetCurrentDate(OnSucceeded, OnFailed);
 }

 function OnSucceeded(result, userContext, methodName) {
   $get('Label1').innerHTML = result;
 }

 function OnFailed(error, userContext, methodName) {
   $get('Label1').innerHTML = "An error occured.";
 }
</script>
<asp:Label runat="server" ID="Label1" Text="Update Me!" /><br />
<input type="button" id="Button2" value="Web Method Update"
  onclick="UpdateTime();" />

 

و

 

[WebMethod]
public static string GetCurrentDate()
{
  return DateTime.Now.ToLongDateString();
}

 

با این روش ما داده هایی رو که در  استفاده از UpdatePanel توسط HTTP Post ارسال می شدن کاملاً حذف و  Response رو به آنچه نیاز داریم کاهش دادیم .

 

 

در این روش و با استفاده از JSON مقدار کل داده های منتقل شده تنها ۲۴ بایت میشه که در مقایسه با ۸۲۷ بایت روش UpdatePanel بسیار کم است .

یک مزیت دیگر این روش هم این است که سرور نیازی به ساخت مجدد کنترل های درون UpdatePanel و طی کردن life-cycle آنها برای رندر کردن کد های HTML  شان ندارد  .

اما در کنار همه این حرف ها هم UpdatePanel مزایای خود را دارد و هم Page Methods معایب خود را .

 

+ مقاله اصلی

 

دسته هاAJAX, ASP.Net برچسب ها:, ,

اسکرول کردن صفحه با JQuery

۱۴ آذر ۱۳۹۰ بدون دیدگاه

یک روش برای انتقال کاربر به بالا و پایین سایت استفاده از anchor هستش . خوب زیاد از نظر ظاهری جالب نیست . اینبار می خوایم با استفاده از جی کوئری وقتی کاربر بر روی کلید بالا و یا پایین کلیک می کنه صفحه رو به آرامی و نرمی اسکرول کنیم تا به بالا یا پایین صفحه بره .دو کلید در سمت چپ پایین صفحه فیکس کردیم که با کلیک بر روی اونها صفحه به سمت بالا و پایین اسکرول می شه .

برای این کار در کنار JQuery نیاز به یک پلاگین کوجیک هم داریم که توی سورس هستش .
خوب اول باید یک صفحه با متن بلند داشته باشیم تا نتیجه کار رو خوب نشون بده . بعد از اضافه کردن رفرنس به JQuery و پلاگین در قسمت Head ، کد اسکریپت زیر رو وارد می کنیم :

<script src="jquery.js" type="text/javascript"></script>
<script src="scroll.js" type="text/javascript"></script>
<script>$(function(){
var $elem=$('#content');
$('#nav_up').fadeIn('slow');
$('#nav_down').fadeIn('slow');

$(window).bind('scrollstart',function(){
$('#nav_up,#nav_down').stop().animate({'opacity:'0.2'});
});
$(window).bind('scrollstop',function(){
$('#nav_up,#nav_down').stop().animate({'opacity:'1'});
});

$('#nav_down').click(
function(e){
$('html,body').animate({scrollTop:$elem.height()},800);
}
);
$('#nav_up').click(
function(e){
$('html,body').animate({scrollTop:'0px'},800);
}
);

در کد بالا Content نام المنتی هستش که محتوایی که قراره اسکرول بشه داخل اون قرار داره . افکت جالبی که در اینجا وجود داره اینه که در حین انجام  اسکرول  کلید های بالا و پایین محو می شن .
وقتی که کاربر بر روی کلید پایین کلیک می کنه با استفاده از تابع Animate مقدار ScrollTop المنت والد برابر با ارتفاع Content میشه .  و برای برگشت به بالا مقدار ScrollTop برابر ۰ قرارش می دیم . که البته هر مقدار دیگه ای هم می تونه باشه .
+ دمو
+ سورس

دسته هادسته‌بندی نشده برچسب ها:

بروز رسانی یک UpdatePanel با استفاده از Javascript

۱۲ آذر ۱۳۹۰ بدون دیدگاه

بعضی مواقع لازم میشه که یک ,update Panel رو از سمت کلاینت بروز رسانی و رفرش کنیم . روش کار ساده ست :

اول کد HTML :


<asp:ScriptManager ID="ScriptManager1" runat="server" />
<div id="Container">
<asp:UpdatePanel runat="server" ID="UpdatePanel1"
    OnLoad="UpdatePanel1_Load">
  <ContentTemplate>
    <asp:Label runat="server" ID="Label1" />
  </ContentTemplate>
</asp:UpdatePanel>

همونطور که می بینید برای UpdatePanel رویداد onload رو باید هندل کنیم .


protected void UpdatePanel1_Load(object sender, EventArgs e)
{
  Label1.Text = DateTime.Now.ToString();
}

هر وقت که updatepanel لود بشه زمان جاری در Label قرار می گیره . حالا چطور updatepanel  رو از سمت کلاینت لود کنیم ؟

برای اینکار از  doPostBack استفاده می کنیم . وقتی که مقدار پارامتر Event Target مربوط به doPostBack یک Async Trigger تعیین شده برای UpdatePanel باشد ، AJAX framework اون رو تحویل می گیره و یک Partial PostBack رو ایجاد می کنه .

در اینجا ما خود UpdatePanel رو به عنوان EventTarget می فرستیم . تگ div رو بصورت زیر اصلاح می کنیم :


<div id="Container" onclick="__doPostBack('ClientIDOfUpdatePanel1', '');">

باید نام سمت کلاینت UpdatePanel رو در doPostBack قرار بدیم . حالا با هر بار کلیک روی محتوای div که خود UpdatePanel هستش . یک Partial PostBack رخ میده و متن درون Label بروز میشه .

دسته هاAJAX, ASP.Net برچسب ها:, , ,

ساخت منو با استفاده از CSS و JQuery

۱۰ آذر ۱۳۹۰ بدون دیدگاه

به دلایل زیادی از منوی Asp.net خوشم نمیاد . استفادش از table ، مشکل داشتن با سمت نمایش Sub menu های پایین تر از سطح دوم . سخت بودن استایل دهی و … من رو کاملاً از استفاده از اون منصرف کرد. برای همین امروز تصمیم گرفتم که خودم یه منو ( دموی منو ) با استفاده از CSS و JQuery بسازم .

منوی ساده ایست ولی خوب قابلیت اضافه کردن افکت ها رو داره . خوبیش هم اینه که براش مهم نیست از چندتا سطح تشکیل شده . با مرورگرهای فایرفاکس ، کروم و اپرا حتماً کار می کنه . IE 6 رو تست نکردم ( ولش کن ) . روی IE7 به بعد هم کار می کنه .

خوب ، برای ساختن این منو مثل همیشه از لیست استفاده کردم . و برای نمایش سطوح از JQuery .

1- تگ های HTML

محتوای HTML مون از یک div با نام Menu و چند لیست تو در تو ( که همون منو باشه ) تشکیل شده . برای هر زیر سطح یک لیست تعریف شده . برای ul سطح اول یه کلاس به نام Static و برای سطوح بعدی کلاسی به نام Dynamic تعریف شده .

<div id="Menu">
<ul>
	<li><a href="#">آیتم یک</a></li>
	<li class="HasSub"><a href="#">آیتم دو</a>
<ul class="Dynamic">
	<li class="HasSub"><a href="#">زیر آیتم یک</a>
<ul class="Dynamic">
	<li><a href="#">زیر آیتم سه</a></li>
	<li><a href="#">زیر آیتم چهار</a></li>
</ul>
</li>
	<li><a href="#">زیر آیتم دو</a></li>
</ul>
</li>
	<li><a href="#">آیتم سه</a></li>
	<li><a href="#">آیتم چهار</a></li>
</ul>
</div>

2- استایل های CSS

برای کلاس Dynamic بصورت پیش فرض display:none قرار داده شده . مقدار margin-right آن به اندازه عرض منو و برای اینکه سطح پایین تر در زمان نمایش هم سطح Parent خود باشد Margin-top نیز برابر با -۴۲ ( ارتفاع هر آیتم به علاوه ۲ پیکسل border بالا و پایین ) تعیین شده است . برای آیتم هایی هم که دارای زیر منو هستن یک کلاس به نام HasSub تعریف شده که در اون می شه یک نشانگر برای مشخص کردن داشتن زیر منو قرار داد ( بصورت بکگراند آیتم ) .

<style>
        body
        {
            direction:rtl;
        }
    #Menu
{
    display:block;
    width:170px;
    border:solid 1px #ccc;

}
#Menu ul
{
     list-style:none;
     width:100%;
     margin:0px;
     padding:0px;
}
#Menu ul.Dynamic
{
     margin-right:171px;
     display:none;
     margin-top:-42px;
     border-top:solid 1px #ccc;
     border-left:solid 1px #ccc;
}

#Menu li
{
      display:block;
      height:40px;
      width:100%;
      border-top:solid 1px #fff;
      border-bottom:solid 1px #E1E1E1;
      background-color:#F7F7F7;
}

#Menu li:hover
{
    background-color:#f1f1f1;
}

#Menu li.HasSub
{
   background-image:url(HasSubArrow.png);
   background-position:10px center;
   background-repeat:no-repeat;
}

#Menu li a
{
    display:block;
    height:2em;
    color:#808080;
    font-family:'b koodak';
    font-size:1em;
    padding-right:10px;
    padding-top:.5em;
}

#Menu li a:hover
{
    color:#000;
}

    </style>

تا اینجای کار منو آماده است اما برای اینکه با قرار گرفتن بر روی آیتم والد زیرمجموعه اون نمایش داده بشه من از JQuery کمک گرفتم .

۳- JQuery

فقط یک تابع هست که در زمانی که نشانگر ماوس بر روی آیتم هایی که دارای کلاس HasSub هستن قرار می گیره میاد و اولین ul زیرمجموعه اون آیتم والد رو به صورت FadeIn نمایش میده . برای این گفتم اولین ul چون اگر این رو تعیین نمی کردم تمام زیرمجموعه ها در تمام سطوح متعلق به اون آیتم والد نمایش داده می شه.


<script type="text/javascript">
$(document).ready( function(){

    $('.HasSub').hover(function(){
        $(this).find('ul:first').fadeIn(500);

    },function(){

    $(this).find('ul:first').fadeOut(500);

    });
});
</script>

همین . خیلی ساده تر از اون چیزی بود که فکرشو می کردم .

کد منو رو هم می تونین از اینجا بردارین .

دسته هادسته‌بندی نشده برچسب ها:

حذف چندین رکورد از بانک اطلاعاتی در یک stored procedure

۲۹ مهر ۱۳۹۰ بدون دیدگاه

در این آدرس می تونید یک مثال خیلی خوب از نحوه حذف کردن همزمان چندین رکورد از بانک اطلاعاتی طی یک درخواست و با یک stored procedure رو ببینید .

دسته هاآموزش, اشتراک گذاری برچسب ها:

Steve jobs

۱۴ مهر ۱۳۹۰ بدون دیدگاه

استیو جابز درگذشت ….

حرفی نمیشه زد …

 

روحش شاد .

دسته هادسته‌بندی نشده برچسب ها: