有几行几列的一个checkbox
比如这样 1 2 3
4 5 6
7 8 9
10 11 12 的checkbox我选 1245 算是矩形 选1379 不算矩形(因为没有铺满里面) 选123456789才算矩形没成矩形弹出框就行。求这样的一个算法。。
有思路不会代码了、从选择的几个点中找出最边的俩个点
然后把这俩个点作为一个矩形先算出里面有几个格子。
最后找出点击的checkbox有多少个。来匹配?不知道我是否想错了。求教育。
而且checkbox的value被占用了。行和列只能放id上了。。
<table style='width:100%;'> <%
int index = 0;
for (int i = 0; i < 10; i++) {
%>
<tr>
<% for (int j = 0; j < 10; j++) {
int blockIndex = index++;
%>
<td> <div style='width:100%;height: 100%;border:1px dashed black;' align="center">
位置<%=blockIndex+ 1%>
<input type="checkbox" name='subBlockIndex' value="<%=blockIndex%>"
id='<%=i%><%=j%>'/>
</div> </td>
<% } %>
</tr>
<% } %> </table>
比如这样 1 2 3
4 5 6
7 8 9
10 11 12 的checkbox我选 1245 算是矩形 选1379 不算矩形(因为没有铺满里面) 选123456789才算矩形没成矩形弹出框就行。求这样的一个算法。。
有思路不会代码了、从选择的几个点中找出最边的俩个点
然后把这俩个点作为一个矩形先算出里面有几个格子。
最后找出点击的checkbox有多少个。来匹配?不知道我是否想错了。求教育。
而且checkbox的value被占用了。行和列只能放id上了。。
<table style='width:100%;'> <%
int index = 0;
for (int i = 0; i < 10; i++) {
%>
<tr>
<% for (int j = 0; j < 10; j++) {
int blockIndex = index++;
%>
<td> <div style='width:100%;height: 100%;border:1px dashed black;' align="center">
位置<%=blockIndex+ 1%>
<input type="checkbox" name='subBlockIndex' value="<%=blockIndex%>"
id='<%=i%><%=j%>'/>
</div> </td>
<% } %>
</tr>
<% } %> </table>
var hasNoneChecked = true;
var num = 0;
var str="";
var arr = new Array(); for(var i=0; i<e.length; i++){
if(e[i].type=='checkbox'&&e[i].checked&&e[i].name!="checkboxAllName"){
hasNoneChecked = false;
//把所有选择的checkbox的id存进数组 追加
arr.push(e[i].id);
}
} if(hasNoneChecked){
return alert("请选择一个位置!");
}else{ //判断是否是矩形
minx = arr[0].substring(0,arr[0].indexOf("_")); //minx
miny = arr[0].substring(arr[0].indexOf("_")+1,arr[0].length);//miny
maxx = arr[arr.length-1].substring(0,arr[arr.length-1].indexOf("_"));
maxy = arr[arr.length-1].substring(arr[arr.length-1].indexOf("_")+1,arr[arr.length-1].length);
min = arr[0];
max = arr[arr.length-1];
if(minx == maxx){
alert("横排");
tmpy = maxy-miny;
if(tmpy+1 == arr.length){
formObject.submit();
}else{
return alert("请围成一个矩形");
}
}else {
tmpx = maxx-minx;
tmpy = maxy-miny;
temp = (tmpx+1)*(tmpy+1);
if(arr.length == temp ){
if((maxx-minx==1)){
formObject.submit();
}else{
//alert(min);
//alert(max);
alert(arr);
//两个以上的竖型
var flag = false;
//alert(maxx+"_"+(maxy-1));
alert(in_array((maxx+"_"+(maxy-1)) , arr ) ==false);
for(var m=0;m<arr.length;m++){
alert(arr[m].indexOf((maxx-1)+"_"+maxy)>0);
if(in_array((maxx+"_"+(maxy-1)) ,arr) && in_array(((maxx-1)+"_"+maxy) ,arr) ){
flag = true;
} }
if(flag){formObject.submit();}
else{
return alert("请围成一个矩形");
}
}
}else {
return alert("请围成一个矩形");
}
}
}
有bug还是
{
// 得到needle的类型
var type = typeof needle; if(type == string || type ==number)
{
for(var i in haystack)
{
if(haystack[i] == needle)
{
return true;
}
}
}
return false;
}
这个是查的一个 不过总是false
int index = 0;
for (int i = 0; i < 10; i++) {
%>
<tr>
<% for (int j = 0; j < 10; j++) {
int blockIndex = index++;
%>
<td> <div style='width:100%;height: 100%;border:1px dashed black;' align="center">
位置<%=blockIndex+ 1%>
<input type="checkbox" name='subBlockIndex' value="<%=blockIndex%>"
id='<%=i%>-<%=j%>'/>
</div> </td>
<% } %>
</tr>
<% } %> </table>
生成的时候给id中间加一个符号,以便于区分当前行列。
然后判断是找到第一个选中的checkbox,假设为1-1,从id中分解出行1列1然后做循环判断第一行,1-2,1-3等直到第一个未选中的checkbox,可以用二维数据记录checkbox的选中情况,再进行下一行判断只要遇到某一行与之前选中的不同即可判断出结果,否则直到遇到某一行第一个未选中亦出结果。
加了个_ 然后切割字符串寻找x y值
* *
* * *
* *
* * *
* *这俩种情况 判断有bug
其他情况都判断好了。
说下我思路。 把checkbox 的checked的值生成一个数组。
然后从数组取最大和最小。
根据最大和最小的x y 值 计算出他们俩围成需要多少个方块。
在跟数组的长度(也就是点击了多少个)比对 这样的话就出现了上面的问题。 然后我是这样处理。 把最大的x y取出 分别算出与他相邻的俩个方块的x y (左面和上面)
并计算是否存在该数组中 存在就证明是对的。
不存在就是不对的。 不过我这样处理的时候 总是返回个false
* *
* *
* *
和
* *
* *
* * 这样都是返回false 我感觉是弱类型在拼接字符和数字 有问题,
但是我试了还是没用返回true
//第一组
//* *
//* * *
// *
这组第一行中间有未选中的,直接可以 判断为false了吧。
// *
//* * *
//* *
这个第一行和第二行选中的不统一,也可以判断为false//下面的一组
//* *
//* *
//* *
这个判断的话就根据横向和竖向的大小是否相同来判断。
//* *
//* *
//* *
这个还是第二行中间有未选中所以false