字符串 rawName = context.getName () ; 在 < option > 标记中使用 href 链接

字符串 classFileName;

我有以下 HTML 代码:

<select name="forma">
<option value="Home">Home</option>
<option value="Contact">Contact</option>
<option value="Sitemap">Sitemap</option>
</select>
/* rawName 类似于 package.name. ContainingClass $ClassName. 我们需要将其转换为 ContainingClass $ClassName.class. */{ Int idx = rawName.lastIndexOf (’.’) ;

如何使 回家接触网站地图值作为链接? ClassFileName = (idx = = -1? rawName: rawName.substring (idx + 1)) + “ . class”; 我使用了以下代码,正如我所预料的那样,它没有起作用:

<select name="forma">
<option value="Home"><a href="home.php">Home</a></option>
<option value="Contact"><a href="contact.php">Contact</a></option>
<option value="Sitemap"><a href="sitemap.php">Sitemap</a></option>
</select>
568908 次浏览
}

更新2022: 这个答案是好的,但是真的在2022年,我们不应该再这样做了!

String uri = context.getResource (classFileName) . toString () ;

更新(2020年5月) : 有人在评论中问我为什么不提倡这个解决方案。我想这是语义学的问题。我宁愿我的用户使用 <a>导航,并保留 <select>来进行表单选择,因为 HTML 元素有语义会议,他们有一个目的,anchors带你到位,<select>是为了从列表中选择东西。

如果(uri.startsWith (“ file:”))抛出新的 IllegalStateException (“这个类是从目录而不是 jar 文件加载的”) ;

考虑一下,如果你使用非传统浏览器(非图形浏览器或屏幕阅读器,或者页面是通过编程访问的,或者禁用了 JavaScript)浏览一个页面,那么你用来导航的 <select>的“意义”或“意图”是什么呢?它说的是“请选择一个页面名称”,而不是很多其他内容,当然也没有关于导航的内容。对此的简单回应是 well i know that my users will be using IE or whatever so shrug,但这有点忽略了语义重要性。

如果(! uri.startsWith (“ jar: file:”)){ Int idx = uri.indexOf (’:’) ;

尽管一个时髦的下拉 UI 元素由合适的布局元素(和一些 js)组成,包含一些常规的锚点,即使布局元素丢失了,它仍然保留了意图,“这些是一堆链接,选择一个,我们将在那里导航”。

字符串协议 = idx = = -1? “(未知)”: uri.substring (0,idx) ; 抛出新的 IllegalStateException (“此类已通过”+ protocol + 远程加载

这是一篇关于 滥用和滥用 <select>的文章。

只支持从本地文件系统的 jar 加载。) }

原始答案

<select name="forma" onchange="location = this.value;">
<option value="Home.php">Home</option>
<option value="Contact.php">Contact</option>
<option value="Sitemap.php">Sitemap</option>
</select>
Int idx = uri.indexOf (’!’) ; //据我所知,下面的 if 语句永远不会触发,所以它更像是一个完整性检查。 如果(idx = = -1)抛出新的 IllegalStateException (“您似乎已经从本地 jar 文件加载了这个类,但是我无法理解 URL!”);

更新(2015年11月) : 在这个时代,如果你想有一个下拉菜单,有很多可以论证的 更好的实施方法。这个答案是一个直接的问题的直接答案,但我不提倡这种方法的公众面对网站。

尝试{

<select>标签创建了一个下拉列表。你不能把 html 链接放在下拉列表中。

String fileName = URLDecoder.decode (uri.substring (“ jar: file:”. length () ,idx) ,Charset.defaultCharset () . name ()) ;

然而,也有一些 JavaScript 库提供类似的功能

返回新文件(fileName) . getAbsolutePath () ;

你不能在选项标签中使用 href 标签,你需要 javascript 来做到这一点。

<select name="formal" onchange="javascript:handleSelect(this)">
<option value="home">Home</option>
<option value="contact">Contact</option>
</select>


<script type="text/javascript">
function handleSelect(elm)
{
window.location = elm.value+".php";
}
</script>

拥有屏幕阅读器的读者通常会浏览一个自动生成的链接列表——他们会错过这些重要信息。许多键盘导航系统(如 JAWS、 Opera)为链接和表单元素提供了不同的键盘快捷方式。

编辑: 如果没有

如果你仍然不能放弃 select的想法,至少不要使用 onchange处理程序。这对于键盘用户来说是一个真正的痛苦,它使你的第三个项目几乎无法访问。

在 Java 中的子包,有没有办法 我使用的界面,但我看不出有什么理由,你应该。

我有一些方法

对于单元测试,如果不需要重写批处理,可以按照建议使用相同的包。

只有在 ENTER 上,onchange 或(JQuery.change ())事件才会触发。

正如其他人所解释的,在 Java 中没有所谓的“子包”: 所有的包都是隔离的,并且不从它们的父包继承任何东西。

虽然我个人不会将表单控件用于简单菜单,但是有许多 Web 应用程序使用表单控件来更改页面的表示(例如,排序顺序)这些可以通过 AJAX 实现,以将新内容加载到页面中,或者在较早的实现中,通过触发新页面加载(本质上是一个页面链接)来实现。

恕我直言,这些都是表单控件的有效用法。

你好

从另一个包访问受保护类成员的一种简单方法是扩展该类并重写这些成员。

例如,要访问包 a.b中的 ClassInA:

package a;


public class ClassInA{
private final String data;


public ClassInA(String data){ this.data = data; }


public String getData(){ return data; }


protected byte[] getDataAsBytes(){ return data.getBytes(); }


protected char[] getDataAsChars(){ return data.toCharArray(); }
}
Protected byte [] getDataAsBytes (){ return super.getDataAsBytes () ; } }

在这个包中创建一个重写 ClassInA中所需方法的类:

package a.b;


import a.ClassInA;


public class ClassInAInB extends ClassInA{
ClassInAInB(String data){ super(data); }


@Override
protected byte[] getDataAsBytes(){ return super.getDataAsBytes(); }
}

这使您可以使用重写类代替另一个包中的类:

package a.b;


import java.util.Arrays;


import a.ClassInA;


public class Driver{
public static void main(String[] args){
ClassInA classInA = new ClassInA("string");
System.out.println(classInA.getData());
// Will fail: getDataAsBytes() has protected access in a.ClassInA
System.out.println(Arrays.toString(classInA.getDataAsBytes()));


ClassInAInB classInAInB = new ClassInAInB("string");
System.out.println(classInAInB.getData());
// Works: getDataAsBytes() is now accessible
System.out.println(Arrays.toString(classInAInB.getDataAsBytes()));
}
}

这使您可以使用重写类代替另一个包中的类:

package a.b;


import java.util.Arrays;


import a.ClassInA;


public class Driver{
public static void main(String[] args){
ClassInA classInA = new ClassInA("string");
System.out.println(classInA.getData());
// Will fail: getDataAsBytes() has protected access in a.ClassInA
System.out.println(Arrays.toString(classInA.getDataAsBytes()));


ClassInAInB classInAInB = new ClassInAInB("string");
System.out.println(classInAInB.getData());
// Works: getDataAsBytes() is now accessible
System.out.println(Arrays.toString(classInAInB.getDataAsBytes()));
}
}

注意,这只适用于受保护的成员,它们对扩展类(继承)可见,而不适用于包-私有成员,它们只对同一个包中的子/扩展类可见。希望这能帮到别人!

如果您希望在子包或兄弟包之间共享代码,而不是在测试/生产用例中,我见过一些库使用的一种解决方案是将共享代码作为公共代码,但是将其记录为仅供内部库使用。

    <select name="career" id="career" onchange="location = this.value;">
<option value="resume" selected> All Applications </option>
<option value="resume&j=14">Seo Expert</option>
<option value="resume&j=21">Project Manager</option>
<option value="resume&j=33">Php Developer</option>
</select>

我相信有人可以做出一个比这更好的答案与 Jquery 在下拉列表中的变化将导致一个新的页面(良好的导航控制在导航栏)。

<td><select name="forma" id='SelectOption'>
<option value="Home"><a href="home.php">Home</a></option>
<option value="Contact"><a href="contact.php">Contact</a></option>
<option value="Sitemap"><a href="sitemap.php">Sitemap</a></option>
</select></td><td>
document.getElementById('SelectOption').addEventListener('change', function() {
val = $( "#SelectOption" ).val();
    

console.log(val)
if(val === 'Home') {
window.open('home.php','_blank');
}
if(val === 'Contact') {
window.open('contact.php', '_blank');
}
if (val === 'Sitemap') {
window.open('sitemap.php', '_blank');
}
});