URL地址中的#符号使用说明

下面的内容介绍了#号的使用,因为在url中多个#号代表不同的意义与区别。
一般我们想让一个a标签点击后执行javascript代码,有以下几种写法:  
方式一:<a href="#" οnclick="alert(1);">点击一</a> 
这种方式的缺点就是点击后会在地址栏的URL后面加#号,同时把页面移动到顶部,一般不建议使用。
方式二:<a href="javascript:void(0);" οnclick="alert(1);">点击一</a> 
这种方式避免了方式一的缺点,点击后对页面没有任何影响。但是有一个致命的缺点,就是在IE6下不能执行form对象的submit()方法,也不能执行跳转语句,比如  
<a href="javascript:void(0);" οnclick="document.forms[0].submit();">点击一</a>  
<a href="javascript:void(0);" οnclick="window.location.href='http://www.google.com';">点击一</a>  
在IE6下就无效,换成href=”#”就能在IE6下正常执行。  

方式三:<a href="###" οnclick="alert(1);">点击一</a> 
点击后虽然会在地址栏的URL后面加三个#号,但是不会影响滚动条,同时在IE6下也能执行form对象的submit()方法与跳转语句,算是一个比较折中的方法。  

结论:我个人认为如果执行的javascript方法中需要提交表单、跳转页面,则用方式三,其它情况都用方式二。  

另:这又附带引出另一个问题,一般重新加载当前页面用如下的javascript代码:  
window.location.href = window.location.href;  
但是当URL地址中含有#时,上述代码无效,于是需要用如下代码:  
window.location.href = window.location.href.split('#')[0];  
将URL地址以#符号分割开,取第一部分即可。  

在很多情况下/index.htm#desc,后面的desc可能就是参数,不容易的参数显示不同的内容,不是简单锚点,而是ajax读取内容。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是使用 Python 完成的密码管理工具代码。其使用了 PyCryptodome 库进行 AES 对称加密和解密,使用了 tkinter 库实现简单的图形界面。 ``` python from tkinter import * from tkinter import messagebox from tkinter import filedialog from Crypto.Cipher import AES from Crypto.Util.Padding import pad, unpad import json import string import random class PasswordManager: def __init__(self, master): self.master = master self.master.title("密码管理工具") self.master.geometry("500x300") self.password = None self.data = {} self.filepath = None # 密码输入框 self.password_entry = Entry(self.master, show="*") self.password_entry.grid(row=0, column=1, padx=5, pady=5) # 密码输入框标签 password_label = Label(self.master, text="请输入密码:") password_label.grid(row=0, column=0, padx=5, pady=5) # 打开密码库按钮 open_button = Button(self.master, text="打开密码库", command=self.open_password_file) open_button.grid(row=1, column=0, padx=5, pady=5) # 保存密码库按钮 save_button = Button(self.master, text="保存密码库", command=self.save_password_file) save_button.grid(row=1, column=1, padx=5, pady=5) # 分类选择 category_label = Label(self.master, text="选择分类:") category_label.grid(row=2, column=0, padx=5, pady=5) self.category_var = StringVar() self.category_choices = ["登录账号", "银行卡", "文本", "地址"] self.category_var.set(self.category_choices[0]) category_option = OptionMenu(self.master, self.category_var, *self.category_choices) category_option.grid(row=2, column=1, padx=5, pady=5) # 名称输入框 name_label = Label(self.master, text="名称:") name_label.grid(row=3, column=0, padx=5, pady=5) self.name_entry = Entry(self.master) self.name_entry.grid(row=3, column=1, padx=5, pady=5) # URL输入框 url_label = Label(self.master, text="URL:") url_label.grid(row=4, column=0, padx=5, pady=5) self.url_entry = Entry(self.master) self.url_entry.grid(row=4, column=1, padx=5, pady=5) # Email输入框 email_label = Label(self.master, text="Email:") email_label.grid(row=5, column=0, padx=5, pady=5) self.email_entry = Entry(self.master) self.email_entry.grid(row=5, column=1, padx=5, pady=5) # 文本输入框 text_label = Label(self.master, text="文本:") text_label.grid(row=6, column=0, padx=5, pady=5) self.text_entry = Entry(self.master) self.text_entry.grid(row=6, column=1, padx=5, pady=5) # 银行帐号输入框 bank_label = Label(self.master, text="银行帐号:") bank_label.grid(row=7, column=0, padx=5, pady=5) self.bank_entry = Entry(self.master) self.bank_entry.grid(row=7, column=1, padx=5, pady=5) # 电话手机输入框 phone_label = Label(self.master, text="电话手机:") phone_label.grid(row=8, column=0, padx=5, pady=5) self.phone_entry = Entry(self.master) self.phone_entry.grid(row=8, column=1, padx=5, pady=5) # 用户名输入框 username_label = Label(self.master, text="用户名:") username_label.grid(row=9, column=0, padx=5, pady=5) self.username_entry = Entry(self.master) self.username_entry.grid(row=9, column=1, padx=5, pady=5) # 密码输入框 password_label = Label(self.master, text="密码:") password_label.grid(row=10, column=0, padx=5, pady=5) self.password_entry_2 = Entry(self.master) self.password_entry_2.grid(row=10, column=1, padx=5, pady=5) # 自动生成密码按钮 generate_button = Button(self.master, text="生成密码", command=self.generate_password) generate_button.grid(row=10, column=2, padx=5, pady=5) # 说明输入框 note_label = Label(self.master, text="说明:") note_label.grid(row=11, column=0, padx=5, pady=5) self.note_entry = Entry(self.master) self.note_entry.grid(row=11, column=1, padx=5, pady=5) # 添加数据按钮 add_button = Button(self.master, text="添加数据", command=self.add_data) add_button.grid(row=12, column=0, padx=5, pady=5) # 查找数据输入框 search_label = Label(self.master, text="查找数据:") search_label.grid(row=13, column=0, padx=5, pady=5) self.search_entry = Entry(self.master) self.search_entry.grid(row=13, column=1, padx=5, pady=5) # 查找数据按钮 search_button = Button(self.master, text="查找数据", command=self.search_data) search_button.grid(row=13, column=2, padx=5, pady=5) def open_password_file(self): self.filepath = filedialog.askopenfilename() if self.filepath: # 读取文件内容 with open(self.filepath, "rb") as f: data = f.read() # 获取密码 self.password = self.password_entry.get() # 解密数据 cipher = AES.new(self.password.encode(), AES.MODE_CBC, b"passwordmanager12") decrypted_data = unpad(cipher.decrypt(data), AES.block_size) # 解析JSON数据 self.data = json.loads(decrypted_data.decode()) # 提示文件打开成功 messagebox.showinfo("提示", "密码库打开成功!") def save_password_file(self): if not self.filepath: self.filepath = filedialog.asksaveasfilename(defaultextension=".pm") if self.filepath: # 获取密码 self.password = self.password_entry.get() # 序列化JSON数据 json_data = json.dumps(self.data).encode() # 加密数据 cipher = AES.new(self.password.encode(), AES.MODE_CBC, b"passwordmanager12") encrypted_data = cipher.encrypt(pad(json_data, AES.block_size)) # 写入文件 with open(self.filepath, "wb") as f: f.write(encrypted_data) # 提示文件保存成功 messagebox.showinfo("提示", "密码库保存成功!") def generate_password(self): length = 12 uppercase = True digits = True symbols = True # 根据密码生成设定生成密码 if uppercase: letters = string.ascii_letters else: letters = string.ascii_lowercase if digits: letters += string.digits if symbols: letters += string.punctuation password = "".join(random.choice(letters) for _ in range(length)) self.password_entry_2.delete(0, END) self.password_entry_2.insert(0, password) def add_data(self): # 获取数据 category = self.category_var.get() name = self.name_entry.get() url = self.url_entry.get() email = self.email_entry.get() text = self.text_entry.get() bank = self.bank_entry.get() phone = self.phone_entry.get() username = self.username_entry.get() password = self.password_entry_2.get() note = self.note_entry.get() # 添加数据到字典 if category not in self.data: self.data[category] = [] data = { "名称": name, "URL": url, "Email": email, "文本": text, "银行帐号": bank, "电话手机": phone, "用户名": username, "密码": password, "说明": note } self.data[category].append(data) # 提示添加成功 messagebox.showinfo("提示", "数据添加成功!") # 清空输入框 self.name_entry.delete(0, END) self.url_entry.delete(0, END) self.email_entry.delete(0, END) self.text_entry.delete(0, END) self.bank_entry.delete(0, END) self.phone_entry.delete(0, END) self.username_entry.delete(0, END) self.password_entry_2.delete(0, END) self.note_entry.delete(0, END) def search_data(self): keyword = self.search_entry.get() # 查找数据 results = [] for category, data_list in self.data.items(): for data in data_list: if keyword in data.values(): results.append(data) # 显示查找结果 if results: result_window = Toplevel(self.master) result_window.title("查找结果") result_window.geometry("600x400") scrollbar = Scrollbar(result_window) scrollbar.pack(side=RIGHT, fill=Y) listbox = Listbox(result_window, yscrollcommand=scrollbar.set) for data in results: listbox.insert(END, data) listbox.pack(fill=BOTH, expand=YES) scrollbar.config(command=listbox.yview) else: messagebox.showinfo("提示", "未找到匹配数据!") if __name__ == "__main__": root = Tk() app = PasswordManager(root) root.mainloop() ``` 需要注意的是,由于 AES 对称加密需要使用同一个密钥进行加密和解密,因此在打开和保存密码库时,需要用户输入相同的密码。另外,为了保证密码的强度,生成密码时可以根据具体需求修改生成设定。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值