[原创]关于Iframe中使用thickbox调用parent.tb_remove()方法无效的解决办法

mikel阅读(999)

最近在网站开发过程中,涉及到thickbox弹出选择商品对话框然后添加到购物清单,并关闭弹出框的功能,因为后台是iframe框架结构,代码如下:


上方是导航nav,左侧是菜单menu,右侧才是操作区域,要实现的弹出thickbox框的操作是在右侧iframe中进行的,首先利用按钮弹出thickbox层,代码如下:

function Search() {
//tb_init("search");
tb_show("搜索结果", "/goods/search?width=800&telOrder=1&keyType=" + $("#keyType").val() + "&keywords=" + encodeURI($("#keywords").val()), null);

}

然后search.aspx页面中选中checkbox的click事件,异步提交商品信息到后台保存,然后关闭当前层,代码如下:

function AddToOrder(id) {
if($("#"+id).attr("checked")) {
//alert($("#" + id).attr("checked"));
$.post("/order/addtoorder", { goodsId: id }, function(data) {
//alert(data);
parent.tb_remove(); //注意这里是错误的,因为iframe的原因parent获取的是整个窗口,而不是当前的iframe中的页面
}, "json");

}
}

注意:parent.tb_remove();这句是不能关闭当前窗口的,因为当前页面是在iframe中,parent获取的是整个窗口,需要再调用右侧iframe才是真正的thickbox的parent页面

改成如下代码,可以成功关闭thickbox:

parent.frames[2].tb_remove();

[转载]非常棒的Web标准学习资源推荐

mikel阅读(823)

[转载]非常棒的Web标准学习资源推荐 – 梦想天空(山边小溪) – 博客园.

Web标准,或者说是网站标准,不是一种单一的标准规范,而是由一些规范共同组成的 标准集合,是由W3C和其它的标准化组织共同制定,用来创建和解释基于Web的内容。这些规范是专门为了那些在网上发布的可向后兼容的文档所设计,使其能 够被大多数人所访问。近年来,这个术语也时常和一套建立网站的标准化的最佳实践方法、网页设计的原理、以及上述方法的衍生物连系在一起。这篇文章向大家推 荐一些非常棒的Web标准化学习资源。

Web 标准和可访问性学习资源

World Wide Web Consortium (W3C)

Web Standards Project

Web Accessibility in Mind

学习教程、参考指南和社区论坛

W3Schools

JavaScript Kit

The JQuery Project

HTML5 Demos

HTML5 Reset

Web Safe Font Tester

Web Style Guide

960 Grid System

HTML/XHTML 代码在线验证工具

W3C Markup Validator

W3C Link Checker

W3C Log Validator

WDG HTML Validator

CSS 代码在线验证工具

W3C CSS Validator

Browser compatibility verification

Browershots

Browser Cam

(编译来源:梦想天空 原文来自:Important Web Standards Resources For Developers

[转载]发个免费的搜群软件

mikel阅读(824)

[转载]发个免费的搜群软件 – hackren – 博客园.

最近急需个搜群的软件,网上的功能都不尽人意,要么最大支持30页,要么就需要验证码。我只是急用一下而已,向群里200多同行求助,希望能给我个使下,竟然没一个人说话。大家在谈论技术、苍井空、MT时都那么活跃,每到谈到共享源码时都鸦雀无声了。

用了半夜时间写了这个软件,希望对需要的人有所帮助!

搜群小妖精使用说明

本程序运行基于.net framework 2.0. 如打开程序报错,请安装.net framework 2.0。

本程序基于webqq3.0开发,使用完全免费。

程序功能:

1、支持多帐号轮换

2、支持单个关键词大批量搜群

3、不依赖浏览器,节省内存开销

4、支持单线程和多线程切换。

5、支持挂机操作

6、可按页码搜索

7、可选多种格式导出群

8、程序永久免费,无广告,无弹窗,无插件

注意:

挂机操作请尽量导入本地小号操作。

如不能自动拨号,请按如下步骤设置宽带连接:

控制面板-网络连接-宽带连接-右键属性-选项-把“提示名称密码和证书等”前面的勾 勾掉
这是本程序首个版本,难免出现bug。

如您对本程序有改进建议,请给我发Email
Email:hackren@vip.qq.com blog:http://hackren.cnblogs.com

下载地址:http://www.gokuai.com/f/2O0ixlF83eu6kRex

下图 使用迅雷或旋风之类的下载软件下载,然后改为RAR文件 即为软件压缩包

[转载]WordPress精美免费主题分享系列全集

mikel阅读(878)

[转载]WordPress精美免费主题分享系列全集 – 山边小溪 – 博客园.

WordPress 是最流行的博客系统,插件众多,易于扩充功能。安装和使用都非常方便,而且有许多第三方开发的免费模板,安装方式简单易用。今天推出系列文章与大家分享142款精美的WordPress免费主题。
WordPress免费精美主题分享系列之简洁风格篇

instantShift: 140+ Brilliant Free WordPress Themes Around
WordPress免费精美主题分享系列之艺术风格篇

instantShift: 140+ Brilliant Free WordPress Themes Around
WordPress免费精美主题分享系列之朴素风格篇

instantShift: 140+ Brilliant Free WordPress Themes Around
WordPress精美免费主题分享系列之杂志风格篇

instantShift: 140+ Brilliant Free WordPress Themes Around
WordPress精美免费主题分享系列之新闻风格篇

instantShift: 140+ Brilliant Free WordPress Themes Around
WordPress精美免费主题分享系列之作品集风格篇

instantShift: 140+ Brilliant Free WordPress Themes Around
WordPress精美免费主题分享系列之游戏风格篇

instantShift: 140+ Brilliant Free WordPress Themes Around
WordPress精美免费主题分享系列之商业风格篇

instantShift: 140+ Brilliant Free WordPress Themes Around
WordPress精美免费主题分享系列之电子商务篇

instantShift: 140+ Brilliant Free WordPress Themes Around
WordPress精美免费主题分享系列之终结篇

instantShift: 140+ Brilliant Free WordPress Themes Around

[转载]Asp.Net MVC2 控件开发实例(1)

mikel阅读(1465)

[转载]Asp.Net MVC2 控件开发实例(1) – 迈克尔二孬 – 博客园.

想开发一个控件,功能比较简单,实现这样一个多选功能:一个文本框,点击时弹出层,左侧展示绑定数据表的数据,右侧为选择后的结果,有左选和右选,取消、清除功能,如下图:

以HtmlHelper的形式调用:

<%=Html.MultiSelectFor(m => m.CodeMC, m => m.CodeDM, dm_jwrylbb,dm<80,,,500,标题, new { @style = width:400px })%>

选择后点击确定,选择项会用分隔符拼接存入文本框,关键信息(如显示项的ID)会存入隐藏域

其中参数按顺序为:文本框ID,隐藏域ID,数据表名称,绑定的数据表过滤条件,分隔符,弹出层高度,标题,htmlAttributes。

思 路:在htmlhelper中构建文本框和隐藏域控件,文本框控件赋予onfocus事件,此事件post调用 PartialViewResult:ShowView(…),此action绑定弹出层所需model,并返回控件view并填充到弹出层中。先来 看helper:(篇幅关系不列出所有重载)

public static MvcHtmlString MultiSelectFor(this HtmlHelper helper, Expression&gt; expressionMC, Expression&gt; expressionDM,string tableName,string condition,string split,int height,string caption, object mcHtmlAttributes)
{
StringBuilder sb = new StringBuilder();
string mcString = ExpressionHelper.GetExpressionText(expressionMC);
string dmString = ExpressionHelper.GetExpressionText(expressionDM);

TagBuilder tag = new TagBuilder("input");
tag.Attributes.Add("type", "text");
tag.Attributes.Add("name", mcString);
tag.GenerateId(mcString);

object mcValue = ModelMetadata.FromLambdaExpression(expressionMC, helper.ViewData).Model;
string mcValueParameter = Convert.ToString(mcValue, System.Globalization.CultureInfo.CurrentCulture);
tag.MergeAttribute("value", mcValueParameter);

TagBuilder tagHidden = new TagBuilder("input");
tagHidden.Attributes.Add("type", "hidden");
tagHidden.Attributes.Add("name", dmString);
tagHidden.GenerateId(dmString);

object dmValue = ModelMetadata.FromLambdaExpression(expressionDM, helper.ViewData).Model;
string dmValueParameter = Convert.ToString(dmValue, System.Globalization.CultureInfo.CurrentCulture);
tagHidden.MergeAttribute("value", dmValueParameter);
RouteValueDictionary dictionary = new RouteValueDictionary();

if (mcHtmlAttributes != null)
tag.MergeAttributes(new RouteValueDictionary(mcHtmlAttributes));
if (!mcHtmlAttributes.ToString().Contains("readonly"))
{
dictionary.Add("onfocus", GetClickEventString(mcString, dmString, tableName, condition, split, height, caption));
}
tag.MergeAttributes(dictionary);
sb.Append(tag.ToString(TagRenderMode.SelfClosing));
sb.Append(tagHidden.ToString(TagRenderMode.SelfClosing));
sb.Append(GetScript(mcString, dmString,height));
return MvcHtmlString.Create(sb.ToString());}

文本框点击事件:(这段折叠显示不出来)

private static string GetClickEventString(string mcName, string dmName, string tableName, string condition, string split,int height,string caption)
        {
            StringBuilder sbClick = new StringBuilder();
            //sbClick.Append("setMSFloat();");
            sbClick.Append("var selectorMC='#'+'" + mcName + "';if($(selectorMC).attr('readonly')==true){return;}");
            sbClick.Append("$.post('/FM/MultiSelect/ShowView',{");
            sbClick.Append("mc:\"" + mcName + "\",dm:\"" + dmName
                + "\",table:\"" + tableName + "\",condition:\"" + condition + "\",sign:\""
                + split + "\",height:\"" + height + "\",mcContent:$('#" + mcName + "').val(),dmContent:$('#" + dmName + "').val()");
            sbClick.Append("},function(data){");
            sbClick.Append("$('#divMS').html(data);}");
            sbClick.Append(");");
            sbClick.Append("$('#divMS').dialog('open');");
            sbClick.Append("$('#divMS').dialog({ title: '" + (string.IsNullOrEmpty(caption) ? "多选" : caption) + "' });");
            return sbClick.ToString();

        } 

其他需要加载的脚本(主要为弹出层初始化代码,弹出层使用了JQuery.ui.dialog,具体使用可查官方文档:http://docs.JQuery.com/UI/Dialog)

private static string GetScript(string modelMCName, string modelDMName,int height)
        {
            StringBuilder script = new StringBuilder();
            script.Append("<script type='text/javascript'>");
            script.Append("$(function () {");

            //script.Append("function setMSFloat(){");
            script.Append("$('<form id=formMS name=formMS><div id=divMS></div></form>').appendTo('body');");
            script.AppendFormat("initDialog('#formMS', '多选', '#divMS', {0}, 480);var s=document.getElementsByName('formMS')[1];$(s).remove();", height);
            //script.Append("};");
            script.Append("});");

            script.Append("</script>");
            return script.ToString();
        }
}

之后是post调用的action:

#region MultiSelectController
public class MultiSelectController : Controller
{
[HttpPost()]
public PartialViewResult ShowView(string mc, string dm, string table, string condition, string sign, int height, string mcContent,string dmContent)
{
string SQL = string.Format(“select * from {0} where 0=0 {1}”, table, string.IsNullOrEmpty(condition) ? string.Empty : “and ” + condition);
System.Data.DataTable dt = ForeignerManagement.Operation.Common.Operation_Common.FillDataTable(SQL);

List msDisplay = new List();

string[] mcArr = mcContent.Split(sign.ToCharArray());
string[] dmArr = dmContent.Split(sign.ToCharArray());
if ((!string.IsNullOrEmpty(mcContent)) && (mcArr.Length == dmArr.Length))
{
for (int i = 0; i < mcArr.Length; i++) { msDisplay.Add(new MSDisplay { MSMC = mcArr[i], MSDM = dmArr[i] }); } } dynamic m = new System.Dynamic.ExpandoObject(); m.CodeCollection = dt.Rows; m.MC = mc; m.DM = dm; m.Sign = sign; m.Height = height - 100; m.ImgHeight = height / 4; m.List = msDisplay; return PartialView("~/Views/Shared/MultiSelect.ascx", m); } } [/csharp] 注:此处使用了动态类型dynamic m = new System.Dynamic.ExpandoObject();省得还得构建一个Model 页面的html和css: [html] <%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl” %>

    <% if (Model.CodeCollection != null) { string hrefID = string.Empty; string hrefIDSelector = string.Empty; foreach (System.Data.DataRow dr in Model.CodeCollection as System.Data.DataRowCollection) { hrefID = "l_" + dr["DM"].ToString(); hrefIDSelector = "#" + hrefID; %>

  • ” style=”color:Black;”><%=dr["MC"].ToString()%>
    ” />
  • <% } } %>

” onclick=”rSelect();” />

” onclick=”lSelect();” />
    <% if (Model.List.Count > 0)
    {
    string hID = string.Empty;
    string hSelector = string.Empty;
    foreach (MSDisplay item in Model.List as List)
    {
    hID = “r_” + item.MSDM;
    hSelector = “#” + hID;
    %>

  • ” style=”color:Black”><%=item.MSMC%>


<%=Html.Hidden("hidMC",Model.MC as string) %>
<%=Html.Hidden("hidDM",Model.DM as string) %>

<%=Html.Hidden("sign", Model.Sign as string)%>
[/html]
至此页面已经可以出来了,下面是控件里面的功能事件脚本: